/*
 * Raphael 1.5.2 - JavaScript Vector Library
 *
 * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
 * Licensed under the MIT (http://raphaeljs.com/license.html) license.
 */
(function() {
	function a() {
		if (a.is(arguments[0], G)) {
			var b = arguments[0],
				d = bV[m](a, b.splice(0, 3 + a.is(b[0], E))),
				e = d.set();
			for (var g = 0, h = b[w]; g < h; g++) {
				var i = b[g] || {};
				c[f](i.type) && e[L](d[i.type]().attr(i))
			}
			return e
		}
		return bV[m](a, arguments)
	}
	a.version = "1.5.2";
	var b = /[, ]+/,
		c = {
			circle: 1,
			rect: 1,
			path: 1,
			ellipse: 1,
			text: 1,
			image: 1
		},
		d = /\{(\d+)\}/g,
		e = "prototype",
		f = "hasOwnProperty",
		g = document,
		h = window,
		i = {
			was: Object[e][f].call(h, "Raphael"),
			is: h.Raphael
		},
		j = function() {
			this.customAttributes = {}
		},
		k, l = "appendChild",
		m = "apply",
		n = "concat",
		o = "createTouch" in g,
		p = "",
		q = " ",
		r = String,
		s = "split",
		t = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend" [s](q),
		u = {
			mousedown: "touchstart",
			mousemove: "touchmove",
			mouseup: "touchend"
		},
		v = "join",
		w = "length",
		x = r[e].toLowerCase,
		y = Math,
		z = y.max,
		A = y.min,
		B = y.abs,
		C = y.pow,
		D = y.PI,
		E = "number",
		F = "string",
		G = "array",
		H = "toString",
		I = "fill",
		J = Object[e][H],
		K = {},
		L = "push",
		M = /^url\(['"]?([^\)]+?)['"]?\)$/i,
		N = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|°|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|°|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,
		O = {
			"NaN": 1,
			Infinity: 1,
			"-Infinity": 1
		},
		P = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
		Q = y.round,
		R = "setAttribute",
		S = parseFloat,
		T = parseInt,
		U = " progid:DXImageTransform.Microsoft",
		V = r[e].toUpperCase,
		W = {
			blur: 0,
			"clip-rect": "0 0 1e9 1e9",
			cursor: "default",
			cx: 0,
			cy: 0,
			fill: "#fff",
			"fill-opacity": 1,
			font: "10px \"Arial\"",
			"font-family": "\"Arial\"",
			"font-size": "10",
			"font-style": "normal",
			"font-weight": 400,
			gradient: 0,
			height: 0,
			href: "http://raphaeljs.com/",
			opacity: 1,
			path: "M0,0",
			r: 0,
			rotation: 0,
			rx: 0,
			ry: 0,
			scale: "1 1",
			src: "",
			stroke: "#000",
			"stroke-dasharray": "",
			"stroke-linecap": "butt",
			"stroke-linejoin": "butt",
			"stroke-miterlimit": 0,
			"stroke-opacity": 1,
			"stroke-width": 1,
			target: "_blank",
			"text-anchor": "middle",
			title: "Raphael",
			translation: "0 0",
			width: 0,
			x: 0,
			y: 0
		},
		X = {
			along: "along",
			blur: E,
			"clip-rect": "csv",
			cx: E,
			cy: E,
			fill: "colour",
			"fill-opacity": E,
			"font-size": E,
			height: E,
			opacity: E,
			path: "path",
			r: E,
			rotation: "csv",
			rx: E,
			ry: E,
			scale: "csv",
			stroke: "colour",
			"stroke-opacity": E,
			"stroke-width": E,
			translation: "csv",
			width: E,
			x: E,
			y: E
		},
		Y = "replace",
		Z = /^(from|to|\d+%?)$/,
		$ = /\s*,\s*/,
		_ = {
			hs: 1,
			rg: 1
		},
		ba = /,?([achlmqrstvxz]),?/gi,
		bb = /([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
		bc = /(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,
		bd = /^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,
		be = function(a, b) {
			return a.key - b.key
		};
	a.type = h.SVGAngle || g.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML";
	if (a.type == "VML") {
		var bf = g.createElement("div"),
			bg;
		bf.innerHTML = "<v:shape adj=\"1\"/>";
		bg = bf.firstChild;
		bg.style.behavior = "url(#default#VML)";
		if (!(bg && typeof bg.adj == "object")) return a.type = null;
		bf = null
	}
	a.svg = !(a.vml = a.type == "VML");
	j[e] = a[e];
	k = j[e];
	a._id = 0;
	a._oid = 0;
	a.fn = {};
	a.is = function(a, b) {
		b = x.call(b);
		if (b == "finite") return !O[f](+a);
		return b == "null" && a === null || b == typeof a || b == "object" && a === Object(a) || b == "array" && Array.isArray && Array.isArray(a) || J.call(a).slice(8, -1).toLowerCase() == b
	};
	a.angle = function(b, c, d, e, f, g) {
		{
			if (f == null) {
				var h = b - d,
					i = c - e;
				if (!h && !i) return 0;
				return ((h < 0) * 180 + y.atan(-i / -h) * 180 / D + 360) % 360
			}
			return a.angle(b, c, f, g) - a.angle(d, e, f, g)
		}
	};
	a.rad = function(a) {
		return a % 360 * D / 180
	};
	a.deg = function(a) {
		return a * 180 / D % 360
	};
	a.snapTo = function(b, c, d) {
		d = a.is(d, "finite") ? d : 10;
		if (a.is(b, G)) {
			var e = b.length;
			while (e--) if (B(b[e] - c) <= d) return b[e]
		} else {
			b = +b;
			var f = c % b;
			if (f < d) return c - f;
			if (f > b - d) return c - f + b
		}
		return c
	};

	function bh() {
		var a = [],
			b = 0;
		for (; b < 32; b++) a[b] = (~ (~ (y.random() * 16)))[H](16);
		a[12] = 4;
		a[16] = (a[16] & 3 | 8)[H](16);
		return "r-" + a[v]("")
	}
	a.setWindow = function(a) {
		h = a;
		g = h.document
	};
	var bi = function(b) {
			if (a.vml) {
				var c = /^\s+|\s+$/g,
					d;
				try {
					var e = new ActiveXObject("htmlfile");
					e.write("<body>");
					e.close();
					d = e.body
				} catch (a) {
					d = createPopup().document.body
				}
				var f = d.createTextRange();
				bi = bm(function(a) {
					try {
						d.style.color = r(a)[Y](c, p);
						var b = f.queryCommandValue("ForeColor");
						b = (b & 255) << 16 | b & 65280 | (b & 16711680) >>> 16;
						return "#" + ("000000" + b[H](16)).slice(-6)
					} catch (a) {
						return "none"
					}
				})
			} else {
				var h = g.createElement("i");
				h.title = "Raphaël Colour Picker";
				h.style.display = "none";
				g.body[l](h);
				bi = bm(function(a) {
					h.style.color = a;
					return g.defaultView.getComputedStyle(h, p).getPropertyValue("color")
				})
			}
			return bi(b)
		},
		bj = function() {
			return "hsb(" + [this.h, this.s, this.b] + ")"
		},
		bk = function() {
			return "hsl(" + [this.h, this.s, this.l] + ")"
		},
		bl = function() {
			return this.hex
		};
	a.hsb2rgb = function(b, c, d, e) {
		if (a.is(b, "object") && "h" in b && "s" in b && "b" in b) {
			d = b.b;
			c = b.s;
			b = b.h;
			e = b.o
		}
		return a.hsl2rgb(b, c, d / 2, e)
	};
	a.hsl2rgb = function(b, c, d, e) {
		if (a.is(b, "object") && "h" in b && "s" in b && "l" in b) {
			d = b.l;
			c = b.s;
			b = b.h
		}
		if (b > 1 || c > 1 || d > 1) {
			b /= 360;
			c /= 100;
			d /= 100
		}
		var f = {},
			g = ["r", "g", "b"],
			h, i, j, k, l, m;
		if (c) {
			d < 0.5 ? h = d * (1 + c) : h = d + c - d * c;
			i = 2 * d - h;
			for (var n = 0; n < 3; n++) {
				j = b + 1 / 3 * -(n - 1);
				j < 0 && j++;
				j > 1 && j--;
				j * 6 < 1 ? f[g[n]] = i + (h - i) * 6 * j : j * 2 < 1 ? f[g[n]] = h : j * 3 < 2 ? f[g[n]] = i + (h - i) * (2 / 3 - j) * 6 : f[g[n]] = i
			}
		} else f = {
			r: d,
			g: d,
			b: d
		};
		f.r *= 255;
		f.g *= 255;
		f.b *= 255;
		f.hex = "#" + (16777216 | f.b | f.g << 8 | f.r << 16).toString(16).slice(1);
		a.is(e, "finite") && (f.opacity = e);
		f.toString = bl;
		return f
	};
	a.rgb2hsb = function(b, c, d) {
		if (c == null && a.is(b, "object") && "r" in b && "g" in b && "b" in b) {
			d = b.b;
			c = b.g;
			b = b.r
		}
		if (c == null && a.is(b, F)) {
			var e = a.getRGB(b);
			b = e.r;
			c = e.g;
			d = e.b
		}
		if (b > 1 || c > 1 || d > 1) {
			b /= 255;
			c /= 255;
			d /= 255
		}
		var f = z(b, c, d),
			g = A(b, c, d),
			h, i, j = f; {
			if (g == f) return {
				h: 0,
				s: 0,
				b: f,
				toString: bj
			};
			var k = f - g;
			i = k / f;
			b == f ? h = (c - d) / k : c == f ? h = 2 + (d - b) / k : h = 4 + (b - c) / k;
			h /= 6;
			h < 0 && h++;
			h > 1 && h--
		}
		return {
			h: h,
			s: i,
			b: j,
			toString: bj
		}
	};
	a.rgb2hsl = function(b, c, d) {
		if (c == null && a.is(b, "object") && "r" in b && "g" in b && "b" in b) {
			d = b.b;
			c = b.g;
			b = b.r
		}
		if (c == null && a.is(b, F)) {
			var e = a.getRGB(b);
			b = e.r;
			c = e.g;
			d = e.b
		}
		if (b > 1 || c > 1 || d > 1) {
			b /= 255;
			c /= 255;
			d /= 255
		}
		var f = z(b, c, d),
			g = A(b, c, d),
			h, i, j = (f + g) / 2,
			k;
		if (g == f) k = {
			h: 0,
			s: 0,
			l: j
		};
		else {
			var l = f - g;
			i = j < 0.5 ? l / (f + g) : l / (2 - f - g);
			b == f ? h = (c - d) / l : c == f ? h = 2 + (d - b) / l : h = 4 + (b - c) / l;
			h /= 6;
			h < 0 && h++;
			h > 1 && h--;
			k = {
				h: h,
				s: i,
				l: j
			}
		}
		k.toString = bk;
		return k
	};
	a._path2string = function() {
		return this.join(",")[Y](ba, "$1")
	};

	function bm(a, b, c) {
		function d() {
			var g = Array[e].slice.call(arguments, 0),
				h = g[v]("►"),
				i = d.cache = d.cache || {},
				j = d.count = d.count || [];
			if (i[f](h)) return c ? c(i[h]) : i[h];
			j[w] >= 1000 && delete i[j.shift()];
			j[L](h);
			i[h] = a[m](b, g);
			return c ? c(i[h]) : i[h]
		}
		return d
	}
	a.getRGB = bm(function(b) {
		if (!b || !(!((b = r(b)).indexOf("-") + 1))) return {
			r: -1,
			g: -1,
			b: -1,
			hex: "none",
			error: 1
		};
		if (b == "none") return {
			r: -1,
			g: -1,
			b: -1,
			hex: "none"
		};
		!(_[f](b.toLowerCase().substring(0, 2)) || b.charAt() == "#") && (b = bi(b));
		var c, d, e, g, h, i, j, k = b.match(N);
		if (k) {
			if (k[2]) {
				g = T(k[2].substring(5), 16);
				e = T(k[2].substring(3, 5), 16);
				d = T(k[2].substring(1, 3), 16)
			}
			if (k[3]) {
				g = T((i = k[3].charAt(3)) + i, 16);
				e = T((i = k[3].charAt(2)) + i, 16);
				d = T((i = k[3].charAt(1)) + i, 16)
			}
			if (k[4]) {
				j = k[4][s]($);
				d = S(j[0]);
				j[0].slice(-1) == "%" && (d *= 2.55);
				e = S(j[1]);
				j[1].slice(-1) == "%" && (e *= 2.55);
				g = S(j[2]);
				j[2].slice(-1) == "%" && (g *= 2.55);
				k[1].toLowerCase().slice(0, 4) == "rgba" && (h = S(j[3]));
				j[3] && j[3].slice(-1) == "%" && (h /= 100)
			}
			if (k[5]) {
				j = k[5][s]($);
				d = S(j[0]);
				j[0].slice(-1) == "%" && (d *= 2.55);
				e = S(j[1]);
				j[1].slice(-1) == "%" && (e *= 2.55);
				g = S(j[2]);
				j[2].slice(-1) == "%" && (g *= 2.55);
				(j[0].slice(-3) == "deg" || j[0].slice(-1) == "°") && (d /= 360);
				k[1].toLowerCase().slice(0, 4) == "hsba" && (h = S(j[3]));
				j[3] && j[3].slice(-1) == "%" && (h /= 100);
				return a.hsb2rgb(d, e, g, h)
			}
			if (k[6]) {
				j = k[6][s]($);
				d = S(j[0]);
				j[0].slice(-1) == "%" && (d *= 2.55);
				e = S(j[1]);
				j[1].slice(-1) == "%" && (e *= 2.55);
				g = S(j[2]);
				j[2].slice(-1) == "%" && (g *= 2.55);
				(j[0].slice(-3) == "deg" || j[0].slice(-1) == "°") && (d /= 360);
				k[1].toLowerCase().slice(0, 4) == "hsla" && (h = S(j[3]));
				j[3] && j[3].slice(-1) == "%" && (h /= 100);
				return a.hsl2rgb(d, e, g, h)
			}
			k = {
				r: d,
				g: e,
				b: g
			};
			k.hex = "#" + (16777216 | g | e << 8 | d << 16).toString(16).slice(1);
			a.is(h, "finite") && (k.opacity = h);
			return k
		}
		return {
			r: -1,
			g: -1,
			b: -1,
			hex: "none",
			error: 1
		}
	}, a);
	a.getColor = function(a) {
		var b = this.getColor.start = this.getColor.start || {
			h: 0,
			s: 1,
			b: a || 0.75
		},
			c = this.hsb2rgb(b.h, b.s, b.b);
		b.h += 0.075;
		if (b.h > 1) {
			b.h = 0;
			b.s -= 0.2;
			b.s <= 0 && (this.getColor.start = {
				h: 0,
				s: 1,
				b: b.b
			})
		}
		return c.hex
	};
	a.getColor.reset = function() {
		delete this.start
	};
	a.parsePathString = bm(function(b) {
		if (!b) return null;
		var c = {
			a: 7,
			c: 6,
			h: 1,
			l: 2,
			m: 2,
			q: 4,
			s: 4,
			t: 2,
			v: 1,
			z: 0
		},
			d = [];
		a.is(b, G) && a.is(b[0], G) && (d = bo(b));
		d[w] || r(b)[Y](bb, function(a, b, e) {
			var f = [],
				g = x.call(b);
			e[Y](bc, function(a, b) {
				b && f[L](+b)
			});
			if (g == "m" && f[w] > 2) {
				d[L]([b][n](f.splice(0, 2)));
				g = "l";
				b = b == "m" ? "l" : "L"
			}
			while (f[w] >= c[g]) {
				d[L]([b][n](f.splice(0, c[g])));
				if (!c[g]) break
			}
		});
		d[H] = a._path2string;
		return d
	});
	a.findDotsAtSegment = function(a, b, c, d, e, f, g, h, i) {
		var j = 1 - i,
			k = C(j, 3) * a + C(j, 2) * 3 * i * c + j * 3 * i * i * e + C(i, 3) * g,
			l = C(j, 3) * b + C(j, 2) * 3 * i * d + j * 3 * i * i * f + C(i, 3) * h,
			m = a + 2 * i * (c - a) + i * i * (e - 2 * c + a),
			n = b + 2 * i * (d - b) + i * i * (f - 2 * d + b),
			o = c + 2 * i * (e - c) + i * i * (g - 2 * e + c),
			p = d + 2 * i * (f - d) + i * i * (h - 2 * f + d),
			q = (1 - i) * a + i * c,
			r = (1 - i) * b + i * d,
			s = (1 - i) * e + i * g,
			t = (1 - i) * f + i * h,
			u = 90 - y.atan((m - o) / (n - p)) * 180 / D;
		(m > o || n < p) && (u += 180);
		return {
			x: k,
			y: l,
			m: {
				x: m,
				y: n
			},
			n: {
				x: o,
				y: p
			},
			start: {
				x: q,
				y: r
			},
			end: {
				x: s,
				y: t
			},
			alpha: u
		}
	};
	var bn = bm(function(a) {
		if (!a) return {
			x: 0,
			y: 0,
			width: 0,
			height: 0
		};
		a = bw(a);
		var b = 0,
			c = 0,
			d = [],
			e = [],
			f;
		for (var g = 0, h = a[w]; g < h; g++) {
			f = a[g];
			if (f[0] == "M") {
				b = f[1];
				c = f[2];
				d[L](b);
				e[L](c)
			} else {
				var i = bv(b, c, f[1], f[2], f[3], f[4], f[5], f[6]);
				d = d[n](i.min.x, i.max.x);
				e = e[n](i.min.y, i.max.y);
				b = f[5];
				c = f[6]
			}
		}
		var j = A[m](0, d),
			k = A[m](0, e);
		return {
			x: j,
			y: k,
			width: z[m](0, d) - j,
			height: z[m](0, e) - k
		}
	}),
		bo = function(b) {
			var c = [];
			if (!a.is(b, G) || !a.is(b && b[0], G)) b = a.parsePathString(b);
			for (var d = 0, e = b[w]; d < e; d++) {
				c[d] = [];
				for (var f = 0, g = b[d][w]; f < g; f++) c[d][f] = b[d][f]
			}
			c[H] = a._path2string;
			return c
		},
		bp = bm(function(b) {
			if (!a.is(b, G) || !a.is(b && b[0], G)) b = a.parsePathString(b);
			var c = [],
				d = 0,
				e = 0,
				f = 0,
				g = 0,
				h = 0;
			if (b[0][0] == "M") {
				d = b[0][1];
				e = b[0][2];
				f = d;
				g = e;
				h++;
				c[L](["M", d, e])
			}
			for (var i = h, j = b[w]; i < j; i++) {
				var k = c[i] = [],
					l = b[i];
				if (l[0] != x.call(l[0])) {
					k[0] = x.call(l[0]);
					switch (k[0]) {
					case "a":
						k[1] = l[1];
						k[2] = l[2];
						k[3] = l[3];
						k[4] = l[4];
						k[5] = l[5];
						k[6] = +(l[6] - d).toFixed(3);
						k[7] = +(l[7] - e).toFixed(3);
						break;
					case "v":
						k[1] = +(l[1] - e).toFixed(3);
						break;
					case "m":
						f = l[1];
						g = l[2];
					default:
						for (var m = 1, n = l[w]; m < n; m++) k[m] = +(l[m] - (m % 2 ? d : e)).toFixed(3)
					}
				} else {
					k = c[i] = [];
					if (l[0] == "m") {
						f = l[1] + d;
						g = l[2] + e
					}
					for (var o = 0, p = l[w]; o < p; o++) c[i][o] = l[o]
				}
				var q = c[i][w];
				switch (c[i][0]) {
				case "z":
					d = f;
					e = g;
					break;
				case "h":
					d += +c[i][q - 1];
					break;
				case "v":
					e += +c[i][q - 1];
					break;
				default:
					d += +c[i][q - 2];
					e += +c[i][q - 1]
				}
			}
			c[H] = a._path2string;
			return c
		}, 0, bo),
		bq = bm(function(b) {
			if (!a.is(b, G) || !a.is(b && b[0], G)) b = a.parsePathString(b);
			var c = [],
				d = 0,
				e = 0,
				f = 0,
				g = 0,
				h = 0;
			if (b[0][0] == "M") {
				d = +b[0][1];
				e = +b[0][2];
				f = d;
				g = e;
				h++;
				c[0] = ["M", d, e]
			}
			for (var i = h, j = b[w]; i < j; i++) {
				var k = c[i] = [],
					l = b[i];
				if (l[0] != V.call(l[0])) {
					k[0] = V.call(l[0]);
					switch (k[0]) {
					case "A":
						k[1] = l[1];
						k[2] = l[2];
						k[3] = l[3];
						k[4] = l[4];
						k[5] = l[5];
						k[6] = +(l[6] + d);
						k[7] = +(l[7] + e);
						break;
					case "V":
						k[1] = +l[1] + e;
						break;
					case "H":
						k[1] = +l[1] + d;
						break;
					case "M":
						f = +l[1] + d;
						g = +l[2] + e;
					default:
						for (var m = 1, n = l[w]; m < n; m++) k[m] = +l[m] + (m % 2 ? d : e)
					}
				} else for (var o = 0, p = l[w]; o < p; o++) c[i][o] = l[o];
				switch (k[0]) {
				case "Z":
					d = f;
					e = g;
					break;
				case "H":
					d = k[1];
					break;
				case "V":
					e = k[1];
					break;
				case "M":
					f = c[i][c[i][w] - 2];
					g = c[i][c[i][w] - 1];
				default:
					d = c[i][c[i][w] - 2];
					e = c[i][c[i][w] - 1]
				}
			}
			c[H] = a._path2string;
			return c
		}, null, bo),
		br = function(a, b, c, d) {
			return [a, b, c, d, c, d]
		},
		bs = function(a, b, c, d, e, f) {
			var g = 1 / 3,
				h = 2 / 3;
			return [g * a + h * c, g * b + h * d, g * e + h * c, g * f + h * d, e, f]
		},
		bt = function(a, b, c, d, e, f, g, h, i, j) {
			var k = D * 120 / 180,
				l = D / 180 * (+e || 0),
				m = [],
				o, p = bm(function(a, b, c) {
					var d = a * y.cos(c) - b * y.sin(c),
						e = a * y.sin(c) + b * y.cos(c);
					return {
						x: d,
						y: e
					}
				});
			if (j) {
				G = j[0];
				H = j[1];
				E = j[2];
				F = j[3]
			} else {
				o = p(a, b, -l);
				a = o.x;
				b = o.y;
				o = p(h, i, -l);
				h = o.x;
				i = o.y;
				var q = y.cos(D / 180 * e),
					r = y.sin(D / 180 * e),
					t = (a - h) / 2,
					u = (b - i) / 2,
					x = t * t / (c * c) + u * u / (d * d);
				if (x > 1) {
					x = y.sqrt(x);
					c = x * c;
					d = x * d
				}
				var z = c * c,
					A = d * d,
					C = (f == g ? -1 : 1) * y.sqrt(B((z * A - z * u * u - A * t * t) / (z * u * u + A * t * t))),
					E = C * c * u / d + (a + h) / 2,
					F = C * -d * t / c + (b + i) / 2,
					G = y.asin(((b - F) / d).toFixed(9)),
					H = y.asin(((i - F) / d).toFixed(9));
				G = a < E ? D - G : G;
				H = h < E ? D - H : H;
				G < 0 && (G = D * 2 + G);
				H < 0 && (H = D * 2 + H);
				g && G > H && (G = G - D * 2);
				!g && H > G && (H = H - D * 2)
			}
			var I = H - G;
			if (B(I) > k) {
				var J = H,
					K = h,
					L = i;
				H = G + k * (g && H > G ? 1 : -1);
				h = E + c * y.cos(H);
				i = F + d * y.sin(H);
				m = bt(h, i, c, d, e, 0, g, K, L, [H, J, E, F])
			}
			I = H - G;
			var M = y.cos(G),
				N = y.sin(G),
				O = y.cos(H),
				P = y.sin(H),
				Q = y.tan(I / 4),
				R = 4 / 3 * c * Q,
				S = 4 / 3 * d * Q,
				T = [a, b],
				U = [a + R * N, b - S * M],
				V = [h + R * P, i - S * O],
				W = [h, i];
			U[0] = 2 * T[0] - U[0];
			U[1] = 2 * T[1] - U[1]; {
				if (j) return [U, V, W][n](m);
				m = [U, V, W][n](m)[v]()[s](",");
				var X = [];
				for (var Y = 0, Z = m[w]; Y < Z; Y++) X[Y] = Y % 2 ? p(m[Y - 1], m[Y], l).y : p(m[Y], m[Y + 1], l).x;
				return X
			}
		},
		bu = function(a, b, c, d, e, f, g, h, i) {
			var j = 1 - i;
			return {
				x: C(j, 3) * a + C(j, 2) * 3 * i * c + j * 3 * i * i * e + C(i, 3) * g,
				y: C(j, 3) * b + C(j, 2) * 3 * i * d + j * 3 * i * i * f + C(i, 3) * h
			}
		},
		bv = bm(function(a, b, c, d, e, f, g, h) {
			var i = e - 2 * c + a - (g - 2 * e + c),
				j = 2 * (c - a) - 2 * (e - c),
				k = a - c,
				l = (-j + y.sqrt(j * j - 4 * i * k)) / 2 / i,
				n = (-j - y.sqrt(j * j - 4 * i * k)) / 2 / i,
				o = [b, h],
				p = [a, g],
				q;
			B(l) > "1e12" && (l = 0.5);
			B(n) > "1e12" && (n = 0.5);
			if (l > 0 && l < 1) {
				q = bu(a, b, c, d, e, f, g, h, l);
				p[L](q.x);
				o[L](q.y)
			}
			if (n > 0 && n < 1) {
				q = bu(a, b, c, d, e, f, g, h, n);
				p[L](q.x);
				o[L](q.y)
			}
			i = f - 2 * d + b - (h - 2 * f + d);
			j = 2 * (d - b) - 2 * (f - d);
			k = b - d;
			l = (-j + y.sqrt(j * j - 4 * i * k)) / 2 / i;
			n = (-j - y.sqrt(j * j - 4 * i * k)) / 2 / i;
			B(l) > "1e12" && (l = 0.5);
			B(n) > "1e12" && (n = 0.5);
			if (l > 0 && l < 1) {
				q = bu(a, b, c, d, e, f, g, h, l);
				p[L](q.x);
				o[L](q.y)
			}
			if (n > 0 && n < 1) {
				q = bu(a, b, c, d, e, f, g, h, n);
				p[L](q.x);
				o[L](q.y)
			}
			return {
				min: {
					x: A[m](0, p),
					y: A[m](0, o)
				},
				max: {
					x: z[m](0, p),
					y: z[m](0, o)
				}
			}
		}),
		bw = bm(function(a, b) {
			var c = bq(a),
				d = b && bq(b),
				e = {
					x: 0,
					y: 0,
					bx: 0,
					by: 0,
					X: 0,
					Y: 0,
					qx: null,
					qy: null
				},
				f = {
					x: 0,
					y: 0,
					bx: 0,
					by: 0,
					X: 0,
					Y: 0,
					qx: null,
					qy: null
				},
				g = function(a, b) {
					var c, d;
					if (!a) return ["C", b.x, b.y, b.x, b.y, b.x, b.y];
					!(a[0] in {
						T: 1,
						Q: 1
					}) && (b.qx = b.qy = null);
					switch (a[0]) {
					case "M":
						b.X = a[1];
						b.Y = a[2];
						break;
					case "A":
						a = ["C"][n](bt[m](0, [b.x, b.y][n](a.slice(1))));
						break;
					case "S":
						c = b.x + (b.x - (b.bx || b.x));
						d = b.y + (b.y - (b.by || b.y));
						a = ["C", c, d][n](a.slice(1));
						break;
					case "T":
						b.qx = b.x + (b.x - (b.qx || b.x));
						b.qy = b.y + (b.y - (b.qy || b.y));
						a = ["C"][n](bs(b.x, b.y, b.qx, b.qy, a[1], a[2]));
						break;
					case "Q":
						b.qx = a[1];
						b.qy = a[2];
						a = ["C"][n](bs(b.x, b.y, a[1], a[2], a[3], a[4]));
						break;
					case "L":
						a = ["C"][n](br(b.x, b.y, a[1], a[2]));
						break;
					case "H":
						a = ["C"][n](br(b.x, b.y, a[1], b.y));
						break;
					case "V":
						a = ["C"][n](br(b.x, b.y, b.x, a[1]));
						break;
					case "Z":
						a = ["C"][n](br(b.x, b.y, b.X, b.Y));
						break
					}
					return a
				},
				h = function(a, b) {
					if (a[b][w] > 7) {
						a[b].shift();
						var e = a[b];
						while (e[w]) a.splice(b++, 0, ["C"][n](e.splice(0, 6)));
						a.splice(b, 1);
						k = z(c[w], d && d[w] || 0)
					}
				},
				i = function(a, b, e, f, g) {
					if (a && b && a[g][0] == "M" && b[g][0] != "M") {
						b.splice(g, 0, ["M", f.x, f.y]);
						e.bx = 0;
						e.by = 0;
						e.x = a[g][1];
						e.y = a[g][2];
						k = z(c[w], d && d[w] || 0)
					}
				};
			for (var j = 0, k = z(c[w], d && d[w] || 0); j < k; j++) {
				c[j] = g(c[j], e);
				h(c, j);
				d && (d[j] = g(d[j], f));
				d && h(d, j);
				i(c, d, e, f, j);
				i(d, c, f, e, j);
				var l = c[j],
					o = d && d[j],
					p = l[w],
					q = d && o[w];
				e.x = l[p - 2];
				e.y = l[p - 1];
				e.bx = S(l[p - 4]) || e.x;
				e.by = S(l[p - 3]) || e.y;
				f.bx = d && (S(o[q - 4]) || f.x);
				f.by = d && (S(o[q - 3]) || f.y);
				f.x = d && o[q - 2];
				f.y = d && o[q - 1]
			}
			return d ? [c, d] : c
		}, null, bo),
		bx = bm(function(b) {
			var c = [];
			for (var d = 0, e = b[w]; d < e; d++) {
				var f = {},
					g = b[d].match(/^([^:]*):?([\d\.]*)/);
				f.color = a.getRGB(g[1]);
				if (f.color.error) return null;
				f.color = f.color.hex;
				g[2] && (f.offset = g[2] + "%");
				c[L](f)
			}
			for (d = 1, e = c[w] - 1; d < e; d++) {
				if (!c[d].offset) {
					var h = S(c[d - 1].offset || 0),
						i = 0;
					for (var j = d + 1; j < e; j++) {
						if (c[j].offset) {
							i = c[j].offset;
							break
						}
					}
					if (!i) {
						i = 100;
						j = e
					}
					i = S(i);
					var k = (i - h) / (j - d + 1);
					for (; d < j; d++) {
						h += k;
						c[d].offset = h + "%"
					}
				}
			}
			return c
		}),
		by = function(b, c, d, e) {
			var f;
			if (a.is(b, F) || a.is(b, "object")) {
				f = a.is(b, F) ? g.getElementById(b) : b;
				if (f.tagName) return c == null ? {
					container: f,
					width: f.style.pixelWidth || f.offsetWidth,
					height: f.style.pixelHeight || f.offsetHeight
				} : {
					container: f,
					width: c,
					height: d
				}
			} else return {
				container: 1,
				x: b,
				y: c,
				width: d,
				height: e
			}
		},
		bz = function(a, b) {
			var c = this;
			for (var d in b) {
				if (b[f](d) && !(d in a)) switch (typeof b[d]) {
				case "function":
					(function(b) {
						a[d] = a === c ? b : function() {
							return b[m](c, arguments)
						}
					})(b[d]);
					break;
				case "object":
					a[d] = a[d] || {};
					bz.call(this, a[d], b[d]);
					break;
				default:
					a[d] = b[d];
					break
				}
			}
		},
		bA = function(a, b) {
			a == b.top && (b.top = a.prev);
			a == b.bottom && (b.bottom = a.next);
			a.next && (a.next.prev = a.prev);
			a.prev && (a.prev.next = a.next)
		},
		bB = function(a, b) {
			if (b.top === a) return;
			bA(a, b);
			a.next = null;
			a.prev = b.top;
			b.top.next = a;
			b.top = a
		},
		bC = function(a, b) {
			if (b.bottom === a) return;
			bA(a, b);
			a.next = b.bottom;
			a.prev = null;
			b.bottom.prev = a;
			b.bottom = a
		},
		bD = function(a, b, c) {
			bA(a, c);
			b == c.top && (c.top = a);
			b.next && (b.next.prev = a);
			a.next = b.next;
			a.prev = b;
			b.next = a
		},
		bE = function(a, b, c) {
			bA(a, c);
			b == c.bottom && (c.bottom = a);
			b.prev && (b.prev.next = a);
			a.prev = b.prev;
			b.prev = a;
			a.next = b
		},
		bF = function(a) {
			return function() {
				throw new Error("Raphaël: you are calling to method “" + a + "” of removed object")
			}
		};
	a.pathToRelative = bp;
	if (a.svg) {
		k.svgns = "http://www.w3.org/2000/svg";
		k.xlink = "http://www.w3.org/1999/xlink";
		Q = function(a) {
			return +a + (~ (~a) === a) * 0.5
		};
		var bG = function(a, b) {
				if (b) for (var c in b) b[f](c) && a[R](c, r(b[c]));
				else {
					a = g.createElementNS(k.svgns, a);
					a.style.webkitTapHighlightColor = "rgba(0,0,0,0)";
					return a
				}
			};
		a[H] = function() {
			return "Your browser supports SVG.\nYou are running Raphaël " + this.version
		};
		var bH = function(a, b) {
				var c = bG("path");
				b.canvas && b.canvas[l](c);
				var d = new bN(c, b);
				d.type = "path";
				bK(d, {
					fill: "none",
					stroke: "#000",
					path: a
				});
				return d
			},
			bI = function(a, b, c) {
				var d = "linear",
					e = 0.5,
					f = 0.5,
					h = a.style;
				b = r(b)[Y](bd, function(a, b, c) {
					d = "radial";
					if (b && c) {
						e = S(b);
						f = S(c);
						var g = (f > 0.5) * 2 - 1;
						C(e - 0.5, 2) + C(f - 0.5, 2) > 0.25 && (f = y.sqrt(0.25 - C(e - 0.5, 2)) * g + 0.5) && f != 0.5 && (f = f.toFixed(5) - 0.00001 * g)
					}
					return p
				});
				b = b[s](/\s*\-\s*/);
				if (d == "linear") {
					var i = b.shift();
					i = -S(i);
					if (isNaN(i)) return null;
					var j = [0, 0, y.cos(i * D / 180), y.sin(i * D / 180)],
						k = 1 / (z(B(j[2]), B(j[3])) || 1);
					j[2] *= k;
					j[3] *= k;
					if (j[2] < 0) {
						j[0] = -j[2];
						j[2] = 0
					}
					if (j[3] < 0) {
						j[1] = -j[3];
						j[3] = 0
					}
				}
				var m = bx(b);
				if (!m) return null;
				var n = a.getAttribute(I);
				n = n.match(/^url\(#(.*)\)$/);
				n && c.defs.removeChild(g.getElementById(n[1]));
				var o = bG(d + "Gradient");
				o.id = bh();
				bG(o, d == "radial" ? {
					fx: e,
					fy: f
				} : {
					x1: j[0],
					y1: j[1],
					x2: j[2],
					y2: j[3]
				});
				c.defs[l](o);
				for (var q = 0, t = m[w]; q < t; q++) {
					var u = bG("stop");
					bG(u, {
						offset: m[q].offset ? m[q].offset : q ? "100%" : "0%",
						"stop-color": m[q].color || "#fff"
					});
					o[l](u)
				}
				bG(a, {
					fill: "url(#" + o.id + ")",
					opacity: 1,
					"fill-opacity": 1
				});
				h.fill = p;
				h.opacity = 1;
				h.fillOpacity = 1;
				return 1
			},
			bJ = function(b) {
				var c = b.getBBox();
				bG(b.pattern, {
					patternTransform: a.format("translate({0},{1})", c.x, c.y)
				})
			},
			bK = function(c, d) {
				var e = {
					"": [0],
					none: [0],
					"-": [3, 1],
					".": [1, 1],
					"-.": [3, 1, 1, 1],
					"-..": [3, 1, 1, 1, 1, 1],
					". ": [1, 3],
					"- ": [4, 3],
					"--": [8, 3],
					"- .": [4, 3, 1, 3],
					"--.": [8, 3, 1, 3],
					"--..": [8, 3, 1, 3, 1, 3]
				},
					h = c.node,
					i = c.attrs,
					j = c.rotate(),
					k = function(a, b) {
						b = e[x.call(b)];
						if (b) {
							var c = a.attrs["stroke-width"] || "1",
								f = ({
									round: c,
									square: c,
									butt: 0
								})[a.attrs["stroke-linecap"] || d["stroke-linecap"]] || 0,
								g = [],
								i = b[w];
							while (i--) g[i] = b[i] * c + (i % 2 ? 1 : -1) * f;
							bG(h, {
								"stroke-dasharray": g[v](",")
							})
						}
					};
				d[f]("rotation") && (j = d.rotation);
				var m = r(j)[s](b);
				if (m.length - 1) {
					m[1] = +m[1];
					m[2] = +m[2]
				} else m = null;
				S(j) && c.rotate(0, true);
				for (var n in d) {
					if (d[f](n)) {
						if (!W[f](n)) continue;
						var o = d[n];
						i[n] = o;
						switch (n) {
						case "blur":
							c.blur(o);
							break;
						case "rotation":
							c.rotate(o, true);
							break;
						case "href":
						case "title":
						case "target":
							var t = h.parentNode;
							if (x.call(t.tagName) != "a") {
								var u = bG("a");
								t.insertBefore(u, h);
								u[l](h);
								t = u
							}
							n == "target" && o == "blank" ? t.setAttributeNS(c.paper.xlink, "show", "new") : t.setAttributeNS(c.paper.xlink, n, o);
							break;
						case "cursor":
							h.style.cursor = o;
							break;
						case "clip-rect":
							var y = r(o)[s](b);
							if (y[w] == 4) {
								c.clip && c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);
								var z = bG("clipPath"),
									A = bG("rect");
								z.id = bh();
								bG(A, {
									x: y[0],
									y: y[1],
									width: y[2],
									height: y[3]
								});
								z[l](A);
								c.paper.defs[l](z);
								bG(h, {
									"clip-path": "url(#" + z.id + ")"
								});
								c.clip = A
							}
							if (!o) {
								var B = g.getElementById(h.getAttribute("clip-path")[Y](/(^url\(#|\)$)/g, p));
								B && B.parentNode.removeChild(B);
								bG(h, {
									"clip-path": p
								});
								delete c.clip
							}
							break;
						case "path":
							c.type == "path" && bG(h, {
								d: o ? i.path = bq(o) : "M0,0"
							});
							break;
						case "width":
							h[R](n, o);
							if (i.fx) {
								n = "x";
								o = i.x
							} else break;
						case "x":
							i.fx && (o = -i.x - (i.width || 0));
						case "rx":
							if (n == "rx" && c.type == "rect") break;
						case "cx":
							m && (n == "x" || n == "cx") && (m[1] += o - i[n]);
							h[R](n, o);
							c.pattern && bJ(c);
							break;
						case "height":
							h[R](n, o);
							if (i.fy) {
								n = "y";
								o = i.y
							} else break;
						case "y":
							i.fy && (o = -i.y - (i.height || 0));
						case "ry":
							if (n == "ry" && c.type == "rect") break;
						case "cy":
							m && (n == "y" || n == "cy") && (m[2] += o - i[n]);
							h[R](n, o);
							c.pattern && bJ(c);
							break;
						case "r":
							c.type == "rect" ? bG(h, {
								rx: o,
								ry: o
							}) : h[R](n, o);
							break;
						case "src":
							c.type == "image" && h.setAttributeNS(c.paper.xlink, "href", o);
							break;
						case "stroke-width":
							h.style.strokeWidth = o;
							h[R](n, o);
							i["stroke-dasharray"] && k(c, i["stroke-dasharray"]);
							break;
						case "stroke-dasharray":
							k(c, o);
							break;
						case "translation":
							var C = r(o)[s](b);
							C[0] = +C[0] || 0;
							C[1] = +C[1] || 0;
							if (m) {
								m[1] += C[0];
								m[2] += C[1]
							}
							cz.call(c, C[0], C[1]);
							break;
						case "scale":
							C = r(o)[s](b);
							c.scale(+C[0] || 1, +C[1] || +C[0] || 1, isNaN(S(C[2])) ? null : +C[2], isNaN(S(C[3])) ? null : +C[3]);
							break;
						case I:
							var D = r(o).match(M);
							if (D) {
								z = bG("pattern");
								var E = bG("image");
								z.id = bh();
								bG(z, {
									x: 0,
									y: 0,
									patternUnits: "userSpaceOnUse",
									height: 1,
									width: 1
								});
								bG(E, {
									x: 0,
									y: 0
								});
								E.setAttributeNS(c.paper.xlink, "href", D[1]);
								z[l](E);
								var F = g.createElement("img");
								F.style.cssText = "position:absolute;left:-9999em;top-9999em";
								F.onload = function() {
									bG(z, {
										width: this.offsetWidth,
										height: this.offsetHeight
									});
									bG(E, {
										width: this.offsetWidth,
										height: this.offsetHeight
									});
									g.body.removeChild(this);
									c.paper.safari()
								};
								g.body[l](F);
								F.src = D[1];
								c.paper.defs[l](z);
								h.style.fill = "url(#" + z.id + ")";
								bG(h, {
									fill: "url(#" + z.id + ")"
								});
								c.pattern = z;
								c.pattern && bJ(c);
								break
							}
							var G = a.getRGB(o);
							if (G.error) if ((({
								circle: 1,
								ellipse: 1
							})[f](c.type) || r(o).charAt() != "r") && bI(h, o, c.paper)) {
								i.gradient = o;
								i.fill = "none";
								break
							} else {
								delete d.gradient;
								delete i.gradient;
								!a.is(i.opacity, "undefined") && a.is(d.opacity, "undefined") && bG(h, {
									opacity: i.opacity
								});
								!a.is(i["fill-opacity"], "undefined") && a.is(d["fill-opacity"], "undefined") && bG(h, {
									"fill-opacity": i["fill-opacity"]
								})
							}
							G[f]("opacity") && bG(h, {
								"fill-opacity": G.opacity > 1 ? G.opacity / 100 : G.opacity
							});
						case "stroke":
							G = a.getRGB(o);
							h[R](n, G.hex);
							n == "stroke" && G[f]("opacity") && bG(h, {
								"stroke-opacity": G.opacity > 1 ? G.opacity / 100 : G.opacity
							});
							break;
						case "gradient":
							(({
								circle: 1,
								ellipse: 1
							})[f](c.type) || r(o).charAt() != "r") && bI(h, o, c.paper);
							break;
						case "opacity":
							i.gradient && !i[f]("stroke-opacity") && bG(h, {
								"stroke-opacity": o > 1 ? o / 100 : o
							});
						case "fill-opacity":
							if (i.gradient) {
								var H = g.getElementById(h.getAttribute(I)[Y](/^url\(#|\)$/g, p));
								if (H) {
									var J = H.getElementsByTagName("stop");
									J[J[w] - 1][R]("stop-opacity", o)
								}
								break
							}
						default:
							n == "font-size" && (o = T(o, 10) + "px");
							var K = n[Y](/(\-.)/g, function(a) {
								return V.call(a.substring(1))
							});
							h.style[K] = o;
							h[R](n, o);
							break
						}
					}
				}
				bM(c, d);
				m ? c.rotate(m.join(q)) : S(j) && c.rotate(j, true)
			},
			bL = 1.2,
			bM = function(b, c) {
				if (b.type != "text" || !(c[f]("text") || c[f]("font") || c[f]("font-size") || c[f]("x") || c[f]("y"))) return;
				var d = b.attrs,
					e = b.node,
					h = e.firstChild ? T(g.defaultView.getComputedStyle(e.firstChild, p).getPropertyValue("font-size"), 10) : 10;
				if (c[f]("text")) {
					d.text = c.text;
					while (e.firstChild) e.removeChild(e.firstChild);
					var i = r(c.text)[s]("\n");
					for (var j = 0, k = i[w]; j < k; j++) if (i[j]) {
						var m = bG("tspan");
						j && bG(m, {
							dy: h * bL,
							x: d.x
						});
						m[l](g.createTextNode(i[j]));
						e[l](m)
					}
				} else {
					i = e.getElementsByTagName("tspan");
					for (j = 0, k = i[w]; j < k; j++) j && bG(i[j], {
						dy: h * bL,
						x: d.x
					})
				}
				bG(e, {
					y: d.y
				});
				var n = b.getBBox(),
					o = d.y - (n.y + n.height / 2);
				o && a.is(o, "finite") && bG(e, {
					y: d.y + o
				})
			},
			bN = function(b, c) {
				var d = 0,
					e = 0;
				this[0] = b;
				this.id = a._oid++;
				this.node = b;
				b.raphael = this;
				this.paper = c;
				this.attrs = this.attrs || {};
				this.transformations = [];
				this._ = {
					tx: 0,
					ty: 0,
					rt: {
						deg: 0,
						cx: 0,
						cy: 0
					},
					sx: 1,
					sy: 1
				};
				!c.bottom && (c.bottom = this);
				this.prev = c.top;
				c.top && (c.top.next = this);
				c.top = this;
				this.next = null
			},
			bO = bN[e];
		bN[e].rotate = function(c, d, e) {
			if (this.removed) return this;
			if (c == null) {
				if (this._.rt.cx) return [this._.rt.deg, this._.rt.cx, this._.rt.cy][v](q);
				return this._.rt.deg
			}
			var f = this.getBBox();
			c = r(c)[s](b);
			if (c[w] - 1) {
				d = S(c[1]);
				e = S(c[2])
			}
			c = S(c[0]);
			d != null && d !== false ? this._.rt.deg = c : this._.rt.deg += c;
			e == null && (d = null);
			this._.rt.cx = d;
			this._.rt.cy = e;
			d = d == null ? f.x + f.width / 2 : d;
			e = e == null ? f.y + f.height / 2 : e;
			if (this._.rt.deg) {
				this.transformations[0] = a.format("rotate({0} {1} {2})", this._.rt.deg, d, e);
				this.clip && bG(this.clip, {
					transform: a.format("rotate({0} {1} {2})", -this._.rt.deg, d, e)
				})
			} else {
				this.transformations[0] = p;
				this.clip && bG(this.clip, {
					transform: p
				})
			}
			bG(this.node, {
				transform: this.transformations[v](q)
			});
			return this
		};
		bN[e].hide = function() {
			!this.removed && (this.node.style.display = "none");
			return this
		};
		bN[e].show = function() {
			!this.removed && (this.node.style.display = "");
			return this
		};
		bN[e].remove = function() {
			if (this.removed) return;
			bA(this, this.paper);
			this.node.parentNode.removeChild(this.node);
			for (var a in this) delete this[a];
			this.removed = true
		};
		bN[e].getBBox = function() {
			if (this.removed) return this;
			if (this.type == "path") return bn(this.attrs.path);
			if (this.node.style.display == "none") {
				this.show();
				var a = true
			}
			var b = {};
			try {
				b = this.node.getBBox()
			} catch (a) {} finally {
				b = b || {}
			}
			if (this.type == "text") {
				b = {
					x: b.x,
					y: Infinity,
					width: 0,
					height: 0
				};
				for (var c = 0, d = this.node.getNumberOfChars(); c < d; c++) {
					var e = this.node.getExtentOfChar(c);
					e.y < b.y && (b.y = e.y);
					e.y + e.height - b.y > b.height && (b.height = e.y + e.height - b.y);
					e.x + e.width - b.x > b.width && (b.width = e.x + e.width - b.x)
				}
			}
			a && this.hide();
			return b
		};
		bN[e].attr = function(b, c) {
			if (this.removed) return this;
			if (b == null) {
				var d = {};
				for (var e in this.attrs) this.attrs[f](e) && (d[e] = this.attrs[e]);
				this._.rt.deg && (d.rotation = this.rotate());
				(this._.sx != 1 || this._.sy != 1) && (d.scale = this.scale());
				d.gradient && d.fill == "none" && (d.fill = d.gradient) && delete d.gradient;
				return d
			}
			if (c == null && a.is(b, F)) {
				if (b == "translation") return cz.call(this);
				if (b == "rotation") return this.rotate();
				if (b == "scale") return this.scale();
				if (b == I && this.attrs.fill == "none" && this.attrs.gradient) return this.attrs.gradient;
				return this.attrs[b]
			}
			if (c == null && a.is(b, G)) {
				var g = {};
				for (var h = 0, i = b.length; h < i; h++) g[b[h]] = this.attr(b[h]);
				return g
			}
			if (c != null) {
				var j = {};
				j[b] = c
			} else b != null && a.is(b, "object") && (j = b);
			for (var k in this.paper.customAttributes) if (this.paper.customAttributes[f](k) && j[f](k) && a.is(this.paper.customAttributes[k], "function")) {
				var l = this.paper.customAttributes[k].apply(this, [][n](j[k]));
				this.attrs[k] = j[k];
				for (var m in l) l[f](m) && (j[m] = l[m])
			}
			bK(this, j);
			return this
		};
		bN[e].toFront = function() {
			if (this.removed) return this;
			this.node.parentNode[l](this.node);
			var a = this.paper;
			a.top != this && bB(this, a);
			return this
		};
		bN[e].toBack = function() {
			if (this.removed) return this;
			if (this.node.parentNode.firstChild != this.node) {
				this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);
				bC(this, this.paper);
				var a = this.paper
			}
			return this
		};
		bN[e].insertAfter = function(a) {
			if (this.removed) return this;
			var b = a.node || a[a.length - 1].node;
			b.nextSibling ? b.parentNode.insertBefore(this.node, b.nextSibling) : b.parentNode[l](this.node);
			bD(this, a, this.paper);
			return this
		};
		bN[e].insertBefore = function(a) {
			if (this.removed) return this;
			var b = a.node || a[0].node;
			b.parentNode.insertBefore(this.node, b);
			bE(this, a, this.paper);
			return this
		};
		bN[e].blur = function(a) {
			var b = this;
			if (+a !== 0) {
				var c = bG("filter"),
					d = bG("feGaussianBlur");
				b.attrs.blur = a;
				c.id = bh();
				bG(d, {
					stdDeviation: +a || 1.5
				});
				c.appendChild(d);
				b.paper.defs.appendChild(c);
				b._blur = c;
				bG(b.node, {
					filter: "url(#" + c.id + ")"
				})
			} else {
				if (b._blur) {
					b._blur.parentNode.removeChild(b._blur);
					delete b._blur;
					delete b.attrs.blur
				}
				b.node.removeAttribute("filter")
			}
		};
		var bP = function(a, b, c, d) {
				var e = bG("circle");
				a.canvas && a.canvas[l](e);
				var f = new bN(e, a);
				f.attrs = {
					cx: b,
					cy: c,
					r: d,
					fill: "none",
					stroke: "#000"
				};
				f.type = "circle";
				bG(e, f.attrs);
				return f
			},
			bQ = function(a, b, c, d, e, f) {
				var g = bG("rect");
				a.canvas && a.canvas[l](g);
				var h = new bN(g, a);
				h.attrs = {
					x: b,
					y: c,
					width: d,
					height: e,
					r: f || 0,
					rx: f || 0,
					ry: f || 0,
					fill: "none",
					stroke: "#000"
				};
				h.type = "rect";
				bG(g, h.attrs);
				return h
			},
			bR = function(a, b, c, d, e) {
				var f = bG("ellipse");
				a.canvas && a.canvas[l](f);
				var g = new bN(f, a);
				g.attrs = {
					cx: b,
					cy: c,
					rx: d,
					ry: e,
					fill: "none",
					stroke: "#000"
				};
				g.type = "ellipse";
				bG(f, g.attrs);
				return g
			},
			bS = function(a, b, c, d, e, f) {
				var g = bG("image");
				bG(g, {
					x: c,
					y: d,
					width: e,
					height: f,
					preserveAspectRatio: "none"
				});
				g.setAttributeNS(a.xlink, "href", b);
				a.canvas && a.canvas[l](g);
				var h = new bN(g, a);
				h.attrs = {
					x: c,
					y: d,
					width: e,
					height: f,
					src: b
				};
				h.type = "image";
				return h
			},
			bT = function(a, b, c, d) {
				var e = bG("text");
				bG(e, {
					x: b,
					y: c,
					"text-anchor": "middle"
				});
				a.canvas && a.canvas[l](e);
				var f = new bN(e, a);
				f.attrs = {
					x: b,
					y: c,
					"text-anchor": "middle",
					text: d,
					font: W.font,
					stroke: "none",
					fill: "#000"
				};
				f.type = "text";
				bK(f, f.attrs);
				return f
			},
			bU = function(a, b) {
				this.width = a || this.width;
				this.height = b || this.height;
				this.canvas[R]("width", this.width);
				this.canvas[R]("height", this.height);
				return this
			},
			bV = function() {
				var b = by[m](0, arguments),
					c = b && b.container,
					d = b.x,
					e = b.y,
					f = b.width,
					h = b.height;
				if (!c) throw new Error("SVG container not found.");
				var i = bG("svg");
				d = d || 0;
				e = e || 0;
				f = f || 512;
				h = h || 342;
				bG(i, {
					xmlns: "http://www.w3.org/2000/svg",
					version: 1.1,
					width: f,
					height: h
				});
				if (c == 1) {
					i.style.cssText = "position:absolute;left:" + d + "px;top:" + e + "px";
					g.body[l](i)
				} else c.firstChild ? c.insertBefore(i, c.firstChild) : c[l](i);
				c = new j;
				c.width = f;
				c.height = h;
				c.canvas = i;
				bz.call(c, c, a.fn);
				c.clear();
				return c
			};
		k.clear = function() {
			var a = this.canvas;
			while (a.firstChild) a.removeChild(a.firstChild);
			this.bottom = this.top = null;
			(this.desc = bG("desc"))[l](g.createTextNode("Created with Raphaël"));
			a[l](this.desc);
			a[l](this.defs = bG("defs"))
		};
		k.remove = function() {
			this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);
			for (var a in this) this[a] = bF(a)
		}
	}
	if (a.vml) {
		var bW = {
			M: "m",
			L: "l",
			C: "c",
			Z: "x",
			m: "t",
			l: "r",
			c: "v",
			z: "x"
		},
			bX = /([clmz]),?([^clmz]*)/gi,
			bY = / progid:\S+Blur\([^\)]+\)/g,
			bZ = /-?[^,\s-]+/g,
			b$ = 1000 + q + 1000,
			b_ = 10,
			ca = {
				path: 1,
				rect: 1
			},
			cb = function(a) {
				var b = /[ahqstv]/ig,
					c = bq;
				r(a).match(b) && (c = bw);
				b = /[clmz]/g;
				if (c == bq && !r(a).match(b)) {
					var d = r(a)[Y](bX, function(a, b, c) {
						var d = [],
							e = x.call(b) == "m",
							f = bW[b];
						c[Y](bZ, function(a) {
							if (e && d[w] == 2) {
								f += d + bW[b == "m" ? "l" : "L"];
								d = []
							}
							d[L](Q(a * b_))
						});
						return f + d
					});
					return d
				}
				var e = c(a),
					f, g;
				d = [];
				for (var h = 0, i = e[w]; h < i; h++) {
					f = e[h];
					g = x.call(e[h][0]);
					g == "z" && (g = "x");
					for (var j = 1, k = f[w]; j < k; j++) g += Q(f[j] * b_) + (j != k - 1 ? "," : p);
					d[L](g)
				}
				return d[v](q)
			};
		a[H] = function() {
			return "Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël " + this.version
		};
		bH = function(a, b) {
			var c = cd("group");
			c.style.cssText = "position:absolute;left:0;top:0;width:" + b.width + "px;height:" + b.height + "px";
			c.coordsize = b.coordsize;
			c.coordorigin = b.coordorigin;
			var d = cd("shape"),
				e = d.style;
			e.width = b.width + "px";
			e.height = b.height + "px";
			d.coordsize = b$;
			d.coordorigin = b.coordorigin;
			c[l](d);
			var f = new bN(d, c, b),
				g = {
					fill: "none",
					stroke: "#000"
				};
			a && (g.path = a);
			f.type = "path";
			f.path = [];
			f.Path = p;
			bK(f, g);
			b.canvas[l](c);
			return f
		};
		bK = function(c, d) {
			c.attrs = c.attrs || {};
			var e = c.node,
				h = c.attrs,
				i = e.style,
				j, k = (d.x != h.x || d.y != h.y || d.width != h.width || d.height != h.height || d.r != h.r) && c.type == "rect",
				m = c;
			for (var n in d) d[f](n) && (h[n] = d[n]);
			if (k) {
				h.path = cc(h.x, h.y, h.width, h.height, h.r);
				c.X = h.x;
				c.Y = h.y;
				c.W = h.width;
				c.H = h.height
			}
			d.href && (e.href = d.href);
			d.title && (e.title = d.title);
			d.target && (e.target = d.target);
			d.cursor && (i.cursor = d.cursor);
			"blur" in d && c.blur(d.blur);
			if (d.path && c.type == "path" || k) e.path = cb(h.path);
			d.rotation != null && c.rotate(d.rotation, true);
			if (d.translation) {
				j = r(d.translation)[s](b);
				cz.call(c, j[0], j[1]);
				if (c._.rt.cx != null) {
					c._.rt.cx += +j[0];
					c._.rt.cy += +j[1];
					c.setBox(c.attrs, j[0], j[1])
				}
			}
			if (d.scale) {
				j = r(d.scale)[s](b);
				c.scale(+j[0] || 1, +j[1] || +j[0] || 1, +j[2] || null, +j[3] || null)
			}
			if ("clip-rect" in d) {
				var o = r(d["clip-rect"])[s](b);
				if (o[w] == 4) {
					o[2] = +o[2] + +o[0];
					o[3] = +o[3] + +o[1];
					var q = e.clipRect || g.createElement("div"),
						t = q.style,
						u = e.parentNode;
					t.clip = a.format("rect({1}px {2}px {3}px {0}px)", o);
					if (!e.clipRect) {
						t.position = "absolute";
						t.top = 0;
						t.left = 0;
						t.width = c.paper.width + "px";
						t.height = c.paper.height + "px";
						u.parentNode.insertBefore(q, u);
						q[l](u);
						e.clipRect = q
					}
				}
				d["clip-rect"] || e.clipRect && (e.clipRect.style.clip = p)
			}
			c.type == "image" && d.src && (e.src = d.src);
			if (c.type == "image" && d.opacity) {
				e.filterOpacity = U + ".Alpha(opacity=" + d.opacity * 100 + ")";
				i.filter = (e.filterMatrix || p) + (e.filterOpacity || p)
			}
			d.font && (i.font = d.font);
			d["font-family"] && (i.fontFamily = "\"" + d["font-family"][s](",")[0][Y](/^['"]+|['"]+$/g, p) + "\"");
			d["font-size"] && (i.fontSize = d["font-size"]);
			d["font-weight"] && (i.fontWeight = d["font-weight"]);
			d["font-style"] && (i.fontStyle = d["font-style"]);
			if (d.opacity != null || d["stroke-width"] != null || d.fill != null || d.stroke != null || d["stroke-width"] != null || d["stroke-opacity"] != null || d["fill-opacity"] != null || d["stroke-dasharray"] != null || d["stroke-miterlimit"] != null || d["stroke-linejoin"] != null || d["stroke-linecap"] != null) {
				e = c.shape || e;
				var v = e.getElementsByTagName(I) && e.getElementsByTagName(I)[0],
					x = false;
				!v && (x = v = cd(I));
				if ("fill-opacity" in d || "opacity" in d) {
					var y = ((+h["fill-opacity"] + 1 || 2) - 1) * ((+h.opacity + 1 || 2) - 1) * ((+a.getRGB(d.fill).o + 1 || 2) - 1);
					y = A(z(y, 0), 1);
					v.opacity = y
				}
				d.fill && (v.on = true);
				if (v.on == null || d.fill == "none") v.on = false;
				if (v.on && d.fill) {
					var B = d.fill.match(M);
					if (B) {
						v.src = B[1];
						v.type = "tile"
					} else {
						v.color = a.getRGB(d.fill).hex;
						v.src = p;
						v.type = "solid";
						if (a.getRGB(d.fill).error && (m.type in {
							circle: 1,
							ellipse: 1
						} || r(d.fill).charAt() != "r") && bI(m, d.fill)) {
							h.fill = "none";
							h.gradient = d.fill
						}
					}
				}
				x && e[l](v);
				var C = e.getElementsByTagName("stroke") && e.getElementsByTagName("stroke")[0],
					D = false;
				!C && (D = C = cd("stroke"));
				if (d.stroke && d.stroke != "none" || d["stroke-width"] || d["stroke-opacity"] != null || d["stroke-dasharray"] || d["stroke-miterlimit"] || d["stroke-linejoin"] || d["stroke-linecap"]) C.on = true;
				(d.stroke == "none" || C.on == null || d.stroke == 0 || d["stroke-width"] == 0) && (C.on = false);
				var E = a.getRGB(d.stroke);
				C.on && d.stroke && (C.color = E.hex);
				y = ((+h["stroke-opacity"] + 1 || 2) - 1) * ((+h.opacity + 1 || 2) - 1) * ((+E.o + 1 || 2) - 1);
				var F = (S(d["stroke-width"]) || 1) * 0.75;
				y = A(z(y, 0), 1);
				d["stroke-width"] == null && (F = h["stroke-width"]);
				d["stroke-width"] && (C.weight = F);
				F && F < 1 && (y *= F) && (C.weight = 1);
				C.opacity = y;
				d["stroke-linejoin"] && (C.joinstyle = d["stroke-linejoin"] || "miter");
				C.miterlimit = d["stroke-miterlimit"] || 8;
				d["stroke-linecap"] && (C.endcap = d["stroke-linecap"] == "butt" ? "flat" : d["stroke-linecap"] == "square" ? "square" : "round");
				if (d["stroke-dasharray"]) {
					var G = {
						"-": "shortdash",
						".": "shortdot",
						"-.": "shortdashdot",
						"-..": "shortdashdotdot",
						". ": "dot",
						"- ": "dash",
						"--": "longdash",
						"- .": "dashdot",
						"--.": "longdashdot",
						"--..": "longdashdotdot"
					};
					C.dashstyle = G[f](d["stroke-dasharray"]) ? G[d["stroke-dasharray"]] : p
				}
				D && e[l](C)
			}
			if (m.type == "text") {
				i = m.paper.span.style;
				h.font && (i.font = h.font);
				h["font-family"] && (i.fontFamily = h["font-family"]);
				h["font-size"] && (i.fontSize = h["font-size"]);
				h["font-weight"] && (i.fontWeight = h["font-weight"]);
				h["font-style"] && (i.fontStyle = h["font-style"]);
				m.node.string && (m.paper.span.innerHTML = r(m.node.string)[Y](/</g, "&#60;")[Y](/&/g, "&#38;")[Y](/\n/g, "<br>"));
				m.W = h.w = m.paper.span.offsetWidth;
				m.H = h.h = m.paper.span.offsetHeight;
				m.X = h.x;
				m.Y = h.y + Q(m.H / 2);
				switch (h["text-anchor"]) {
				case "start":
					m.node.style["v-text-align"] = "left";
					m.bbx = Q(m.W / 2);
					break;
				case "end":
					m.node.style["v-text-align"] = "right";
					m.bbx = -Q(m.W / 2);
					break;
				default:
					m.node.style["v-text-align"] = "center";
					break
				}
			}
		};
		bI = function(a, b) {
			a.attrs = a.attrs || {};
			var c = a.attrs,
				d, e = "linear",
				f = ".5 .5";
			a.attrs.gradient = b;
			b = r(b)[Y](bd, function(a, b, c) {
				e = "radial";
				if (b && c) {
					b = S(b);
					c = S(c);
					C(b - 0.5, 2) + C(c - 0.5, 2) > 0.25 && (c = y.sqrt(0.25 - C(b - 0.5, 2)) * ((c > 0.5) * 2 - 1) + 0.5);
					f = b + q + c
				}
				return p
			});
			b = b[s](/\s*\-\s*/);
			if (e == "linear") {
				var g = b.shift();
				g = -S(g);
				if (isNaN(g)) return null
			}
			var h = bx(b);
			if (!h) return null;
			a = a.shape || a.node;
			d = a.getElementsByTagName(I)[0] || cd(I);
			!d.parentNode && a.appendChild(d);
			if (h[w]) {
				d.on = true;
				d.method = "none";
				d.color = h[0].color;
				d.color2 = h[h[w] - 1].color;
				var i = [];
				for (var j = 0, k = h[w]; j < k; j++) h[j].offset && i[L](h[j].offset + q + h[j].color);
				d.colors && (d.colors.value = i[w] ? i[v]() : "0% " + d.color);
				if (e == "radial") {
					d.type = "gradientradial";
					d.focus = "100%";
					d.focussize = f;
					d.focusposition = f
				} else {
					d.type = "gradient";
					d.angle = (270 - g) % 360
				}
			}
			return 1
		};
		bN = function(b, c, d) {
			var e = 0,
				f = 0,
				g = 0,
				h = 1;
			this[0] = b;
			this.id = a._oid++;
			this.node = b;
			b.raphael = this;
			this.X = 0;
			this.Y = 0;
			this.attrs = {};
			this.Group = c;
			this.paper = d;
			this._ = {
				tx: 0,
				ty: 0,
				rt: {
					deg: 0
				},
				sx: 1,
				sy: 1
			};
			!d.bottom && (d.bottom = this);
			this.prev = d.top;
			d.top && (d.top.next = this);
			d.top = this;
			this.next = null
		};
		bO = bN[e];
		bO.rotate = function(a, c, d) {
			if (this.removed) return this;
			if (a == null) {
				if (this._.rt.cx) return [this._.rt.deg, this._.rt.cx, this._.rt.cy][v](q);
				return this._.rt.deg
			}
			a = r(a)[s](b);
			if (a[w] - 1) {
				c = S(a[1]);
				d = S(a[2])
			}
			a = S(a[0]);
			c != null ? this._.rt.deg = a : this._.rt.deg += a;
			d == null && (c = null);
			this._.rt.cx = c;
			this._.rt.cy = d;
			this.setBox(this.attrs, c, d);
			this.Group.style.rotation = this._.rt.deg;
			return this
		};
		bO.setBox = function(a, b, c) {
			if (this.removed) return this;
			var d = this.Group.style,
				e = this.shape && this.shape.style || this.node.style;
			a = a || {};
			for (var g in a) a[f](g) && (this.attrs[g] = a[g]);
			b = b || this._.rt.cx;
			c = c || this._.rt.cy;
			var h = this.attrs,
				i, j, k, l;
			switch (this.type) {
			case "circle":
				i = h.cx - h.r;
				j = h.cy - h.r;
				k = l = h.r * 2;
				break;
			case "ellipse":
				i = h.cx - h.rx;
				j = h.cy - h.ry;
				k = h.rx * 2;
				l = h.ry * 2;
				break;
			case "image":
				i = +h.x;
				j = +h.y;
				k = h.width || 0;
				l = h.height || 0;
				break;
			case "text":
				this.textpath.v = ["m", Q(h.x), ", ", Q(h.y - 2), "l", Q(h.x) + 1, ", ", Q(h.y - 2)][v](p);
				i = h.x - Q(this.W / 2);
				j = h.y - this.H / 2;
				k = this.W;
				l = this.H;
				break;
			case "rect":
			case "path":
				if (this.attrs.path) {
					var m = bn(this.attrs.path);
					i = m.x;
					j = m.y;
					k = m.width;
					l = m.height
				} else {
					i = 0;
					j = 0;
					k = this.paper.width;
					l = this.paper.height
				}
				break;
			default:
				i = 0;
				j = 0;
				k = this.paper.width;
				l = this.paper.height;
				break
			}
			b = b == null ? i + k / 2 : b;
			c = c == null ? j + l / 2 : c;
			var n = b - this.paper.width / 2,
				o = c - this.paper.height / 2,
				q;
			d.left != (q = n + "px") && (d.left = q);
			d.top != (q = o + "px") && (d.top = q);
			this.X = ca[f](this.type) ? -n : i;
			this.Y = ca[f](this.type) ? -o : j;
			this.W = k;
			this.H = l;
			if (ca[f](this.type)) {
				e.left != (q = -n * b_ + "px") && (e.left = q);
				e.top != (q = -o * b_ + "px") && (e.top = q)
			} else if (this.type == "text") {
				e.left != (q = -n + "px") && (e.left = q);
				e.top != (q = -o + "px") && (e.top = q)
			} else {
				d.width != (q = this.paper.width + "px") && (d.width = q);
				d.height != (q = this.paper.height + "px") && (d.height = q);
				e.left != (q = i - n + "px") && (e.left = q);
				e.top != (q = j - o + "px") && (e.top = q);
				e.width != (q = k + "px") && (e.width = q);
				e.height != (q = l + "px") && (e.height = q)
			}
		};
		bO.hide = function() {
			!this.removed && (this.Group.style.display = "none");
			return this
		};
		bO.show = function() {
			!this.removed && (this.Group.style.display = "block");
			return this
		};
		bO.getBBox = function() {
			if (this.removed) return this;
			if (ca[f](this.type)) return bn(this.attrs.path);
			return {
				x: this.X + (this.bbx || 0),
				y: this.Y,
				width: this.W,
				height: this.H
			}
		};
		bO.remove = function() {
			if (this.removed) return;
			bA(this, this.paper);
			this.node.parentNode.removeChild(this.node);
			this.Group.parentNode.removeChild(this.Group);
			this.shape && this.shape.parentNode.removeChild(this.shape);
			for (var a in this) delete this[a];
			this.removed = true
		};
		bO.attr = function(b, c) {
			if (this.removed) return this;
			if (b == null) {
				var d = {};
				for (var e in this.attrs) this.attrs[f](e) && (d[e] = this.attrs[e]);
				this._.rt.deg && (d.rotation = this.rotate());
				(this._.sx != 1 || this._.sy != 1) && (d.scale = this.scale());
				d.gradient && d.fill == "none" && (d.fill = d.gradient) && delete d.gradient;
				return d
			}
			if (c == null && a.is(b, "string")) {
				if (b == "translation") return cz.call(this);
				if (b == "rotation") return this.rotate();
				if (b == "scale") return this.scale();
				if (b == I && this.attrs.fill == "none" && this.attrs.gradient) return this.attrs.gradient;
				return this.attrs[b]
			}
			if (this.attrs && c == null && a.is(b, G)) {
				var g, h = {};
				for (e = 0, g = b[w]; e < g; e++) h[b[e]] = this.attr(b[e]);
				return h
			}
			var i;
			if (c != null) {
				i = {};
				i[b] = c
			}
			c == null && a.is(b, "object") && (i = b);
			if (i) {
				for (var j in this.paper.customAttributes) if (this.paper.customAttributes[f](j) && i[f](j) && a.is(this.paper.customAttributes[j], "function")) {
					var k = this.paper.customAttributes[j].apply(this, [][n](i[j]));
					this.attrs[j] = i[j];
					for (var l in k) k[f](l) && (i[l] = k[l])
				}
				i.text && this.type == "text" && (this.node.string = i.text);
				bK(this, i);
				i.gradient && (({
					circle: 1,
					ellipse: 1
				})[f](this.type) || r(i.gradient).charAt() != "r") && bI(this, i.gradient);
				(!ca[f](this.type) || this._.rt.deg) && this.setBox(this.attrs)
			}
			return this
		};
		bO.toFront = function() {
			!this.removed && this.Group.parentNode[l](this.Group);
			this.paper.top != this && bB(this, this.paper);
			return this
		};
		bO.toBack = function() {
			if (this.removed) return this;
			if (this.Group.parentNode.firstChild != this.Group) {
				this.Group.parentNode.insertBefore(this.Group, this.Group.parentNode.firstChild);
				bC(this, this.paper)
			}
			return this
		};
		bO.insertAfter = function(a) {
			if (this.removed) return this;
			a.constructor == cC && (a = a[a.length - 1]);
			a.Group.nextSibling ? a.Group.parentNode.insertBefore(this.Group, a.Group.nextSibling) : a.Group.parentNode[l](this.Group);
			bD(this, a, this.paper);
			return this
		};
		bO.insertBefore = function(a) {
			if (this.removed) return this;
			a.constructor == cC && (a = a[0]);
			a.Group.parentNode.insertBefore(this.Group, a.Group);
			bE(this, a, this.paper);
			return this
		};
		bO.blur = function(b) {
			var c = this.node.runtimeStyle,
				d = c.filter;
			d = d.replace(bY, p);
			if (+b !== 0) {
				this.attrs.blur = b;
				c.filter = d + q + U + ".Blur(pixelradius=" + (+b || 1.5) + ")";
				c.margin = a.format("-{0}px 0 0 -{0}px", Q(+b || 1.5))
			} else {
				c.filter = d;
				c.margin = 0;
				delete this.attrs.blur
			}
		};
		bP = function(a, b, c, d) {
			var e = cd("group"),
				f = cd("oval"),
				g = f.style;
			e.style.cssText = "position:absolute;left:0;top:0;width:" + a.width + "px;height:" + a.height + "px";
			e.coordsize = b$;
			e.coordorigin = a.coordorigin;
			e[l](f);
			var h = new bN(f, e, a);
			h.type = "circle";
			bK(h, {
				stroke: "#000",
				fill: "none"
			});
			h.attrs.cx = b;
			h.attrs.cy = c;
			h.attrs.r = d;
			h.setBox({
				x: b - d,
				y: c - d,
				width: d * 2,
				height: d * 2
			});
			a.canvas[l](e);
			return h
		};

		function cc(b, c, d, e, f) {
			return f ? a.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z", b + f, c, d - f * 2, f, -f, e - f * 2, f * 2 - d, f * 2 - e) : a.format("M{0},{1}l{2},0,0,{3},{4},0z", b, c, d, e, -d)
		}
		bQ = function(a, b, c, d, e, f) {
			var g = cc(b, c, d, e, f),
				h = a.path(g),
				i = h.attrs;
			h.X = i.x = b;
			h.Y = i.y = c;
			h.W = i.width = d;
			h.H = i.height = e;
			i.r = f;
			i.path = g;
			h.type = "rect";
			return h
		};
		bR = function(a, b, c, d, e) {
			var f = cd("group"),
				g = cd("oval"),
				h = g.style;
			f.style.cssText = "position:absolute;left:0;top:0;width:" + a.width + "px;height:" + a.height + "px";
			f.coordsize = b$;
			f.coordorigin = a.coordorigin;
			f[l](g);
			var i = new bN(g, f, a);
			i.type = "ellipse";
			bK(i, {
				stroke: "#000"
			});
			i.attrs.cx = b;
			i.attrs.cy = c;
			i.attrs.rx = d;
			i.attrs.ry = e;
			i.setBox({
				x: b - d,
				y: c - e,
				width: d * 2,
				height: e * 2
			});
			a.canvas[l](f);
			return i
		};
		bS = function(a, b, c, d, e, f) {
			var g = cd("group"),
				h = cd("image");
			g.style.cssText = "position:absolute;left:0;top:0;width:" + a.width + "px;height:" + a.height + "px";
			g.coordsize = b$;
			g.coordorigin = a.coordorigin;
			h.src = b;
			g[l](h);
			var i = new bN(h, g, a);
			i.type = "image";
			i.attrs.src = b;
			i.attrs.x = c;
			i.attrs.y = d;
			i.attrs.w = e;
			i.attrs.h = f;
			i.setBox({
				x: c,
				y: d,
				width: e,
				height: f
			});
			a.canvas[l](g);
			return i
		};
		bT = function(b, c, d, e) {
			var f = cd("group"),
				g = cd("shape"),
				h = g.style,
				i = cd("path"),
				j = i.style,
				k = cd("textpath");
			f.style.cssText = "position:absolute;left:0;top:0;width:" + b.width + "px;height:" + b.height + "px";
			f.coordsize = b$;
			f.coordorigin = b.coordorigin;
			i.v = a.format("m{0},{1}l{2},{1}", Q(c * 10), Q(d * 10), Q(c * 10) + 1);
			i.textpathok = true;
			h.width = b.width;
			h.height = b.height;
			k.string = r(e);
			k.on = true;
			g[l](k);
			g[l](i);
			f[l](g);
			var m = new bN(k, f, b);
			m.shape = g;
			m.textpath = i;
			m.type = "text";
			m.attrs.text = e;
			m.attrs.x = c;
			m.attrs.y = d;
			m.attrs.w = 1;
			m.attrs.h = 1;
			bK(m, {
				font: W.font,
				stroke: "none",
				fill: "#000"
			});
			m.setBox();
			b.canvas[l](f);
			return m
		};
		bU = function(a, b) {
			var c = this.canvas.style;
			a == +a && (a += "px");
			b == +b && (b += "px");
			c.width = a;
			c.height = b;
			c.clip = "rect(0 " + a + " " + b + " 0)";
			return this
		};
		var cd;
		g.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
		try {
			!g.namespaces.rvml && g.namespaces.add("rvml", "urn:schemas-microsoft-com:vml");
			cd = function(a) {
				return g.createElement("<rvml:" + a + " class=\"rvml\">")
			}
		} catch (a) {
			cd = function(a) {
				return g.createElement("<" + a + " xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">")
			}
		}
		bV = function() {
			var b = by[m](0, arguments),
				c = b.container,
				d = b.height,
				e, f = b.width,
				h = b.x,
				i = b.y;
			if (!c) throw new Error("VML container not found.");
			var k = new j,
				n = k.canvas = g.createElement("div"),
				o = n.style;
			h = h || 0;
			i = i || 0;
			f = f || 512;
			d = d || 342;
			f == +f && (f += "px");
			d == +d && (d += "px");
			k.width = 1000;
			k.height = 1000;
			k.coordsize = b_ * 1000 + q + b_ * 1000;
			k.coordorigin = "0 0";
			k.span = g.createElement("span");
			k.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";
			n[l](k.span);
			o.cssText = a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", f, d);
			if (c == 1) {
				g.body[l](n);
				o.left = h + "px";
				o.top = i + "px";
				o.position = "absolute"
			} else c.firstChild ? c.insertBefore(n, c.firstChild) : c[l](n);
			bz.call(k, k, a.fn);
			return k
		};
		k.clear = function() {
			this.canvas.innerHTML = p;
			this.span = g.createElement("span");
			this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";
			this.canvas[l](this.span);
			this.bottom = this.top = null
		};
		k.remove = function() {
			this.canvas.parentNode.removeChild(this.canvas);
			for (var a in this) this[a] = bF(a);
			return true
		}
	}
	var ce = navigator.userAgent.match(/Version\/(.*?)\s/);
	navigator.vendor == "Apple Computer, Inc." && (ce && ce[1] < 4 || navigator.platform.slice(0, 2) == "iP") ? k.safari = function() {
		var a = this.rect(-99, -99, this.width + 99, this.height + 99).attr({
			stroke: "none"
		});
		h.setTimeout(function() {
			a.remove()
		})
	} : k.safari = function() {};
	var cf = function() {
			this.returnValue = false
		},
		cg = function() {
			return this.originalEvent.preventDefault()
		},
		ch = function() {
			this.cancelBubble = true
		},
		ci = function() {
			return this.originalEvent.stopPropagation()
		},
		cj = (function() {
			{
				if (g.addEventListener) return function(a, b, c, d) {
					var e = o && u[b] ? u[b] : b,
						g = function(e) {
							if (o && u[f](b)) for (var g = 0, h = e.targetTouches && e.targetTouches.length; g < h; g++) {
								if (e.targetTouches[g].target == a) {
									var i = e;
									e = e.targetTouches[g];
									e.originalEvent = i;
									e.preventDefault = cg;
									e.stopPropagation = ci;
									break
								}
							}
							return c.call(d, e)
						};
					a.addEventListener(e, g, false);
					return function() {
						a.removeEventListener(e, g, false);
						return true
					}
				};
				if (g.attachEvent) return function(a, b, c, d) {
					var e = function(a) {
							a = a || h.event;
							a.preventDefault = a.preventDefault || cf;
							a.stopPropagation = a.stopPropagation || ch;
							return c.call(d, a)
						};
					a.attachEvent("on" + b, e);
					var f = function() {
							a.detachEvent("on" + b, e);
							return true
						};
					return f
				}
			}
		})(),
		ck = [],
		cl = function(a) {
			var b = a.clientX,
				c = a.clientY,
				d = g.documentElement.scrollTop || g.body.scrollTop,
				e = g.documentElement.scrollLeft || g.body.scrollLeft,
				f, h = ck.length;
			while (h--) {
				f = ck[h];
				if (o) {
					var i = a.touches.length,
						j;
					while (i--) {
						j = a.touches[i];
						if (j.identifier == f.el._drag.id) {
							b = j.clientX;
							c = j.clientY;
							(a.originalEvent ? a.originalEvent : a).preventDefault();
							break
						}
					}
				} else a.preventDefault();
				b += e;
				c += d;
				f.move && f.move.call(f.move_scope || f.el, b - f.el._drag.x, c - f.el._drag.y, b, c, a)
			}
		},
		cm = function(b) {
			a.unmousemove(cl).unmouseup(cm);
			var c = ck.length,
				d;
			while (c--) {
				d = ck[c];
				d.el._drag = {};
				d.end && d.end.call(d.end_scope || d.start_scope || d.move_scope || d.el, b)
			}
			ck = []
		};
	for (var cn = t[w]; cn--;)(function(b) {
		a[b] = bN[e][b] = function(c, d) {
			if (a.is(c, "function")) {
				this.events = this.events || [];
				this.events.push({
					name: b,
					f: c,
					unbind: cj(this.shape || this.node || g, b, c, d || this)
				})
			}
			return this
		};
		a["un" + b] = bN[e]["un" + b] = function(a) {
			var c = this.events,
				d = c[w];
			while (d--) if (c[d].name == b && c[d].f == a) {
				c[d].unbind();
				c.splice(d, 1);
				!c.length && delete this.events;
				return this
			}
			return this
		}
	})(t[cn]);
	bO.hover = function(a, b, c, d) {
		return this.mouseover(a, c).mouseout(b, d || c)
	};
	bO.unhover = function(a, b) {
		return this.unmouseover(a).unmouseout(b)
	};
	bO.drag = function(b, c, d, e, f, h) {
		this._drag = {};
		this.mousedown(function(i) {
			(i.originalEvent || i).preventDefault();
			var j = g.documentElement.scrollTop || g.body.scrollTop,
				k = g.documentElement.scrollLeft || g.body.scrollLeft;
			this._drag.x = i.clientX + k;
			this._drag.y = i.clientY + j;
			this._drag.id = i.identifier;
			c && c.call(f || e || this, i.clientX + k, i.clientY + j, i);
			!ck.length && a.mousemove(cl).mouseup(cm);
			ck.push({
				el: this,
				move: b,
				end: d,
				move_scope: e,
				start_scope: f,
				end_scope: h
			})
		});
		return this
	};
	bO.undrag = function(b, c, d) {
		var e = ck.length;
		while (e--) ck[e].el == this && (ck[e].move == b && ck[e].end == d) && ck.splice(e++, 1);
		!ck.length && a.unmousemove(cl).unmouseup(cm)
	};
	k.circle = function(a, b, c) {
		return bP(this, a || 0, b || 0, c || 0)
	};
	k.rect = function(a, b, c, d, e) {
		return bQ(this, a || 0, b || 0, c || 0, d || 0, e || 0)
	};
	k.ellipse = function(a, b, c, d) {
		return bR(this, a || 0, b || 0, c || 0, d || 0)
	};
	k.path = function(b) {
		b && !a.is(b, F) && !a.is(b[0], G) && (b += p);
		return bH(a.format[m](a, arguments), this)
	};
	k.image = function(a, b, c, d, e) {
		return bS(this, a || "about:blank", b || 0, c || 0, d || 0, e || 0)
	};
	k.text = function(a, b, c) {
		return bT(this, a || 0, b || 0, r(c))
	};
	k.set = function(a) {
		arguments[w] > 1 && (a = Array[e].splice.call(arguments, 0, arguments[w]));
		return new cC(a)
	};
	k.setSize = bU;
	k.top = k.bottom = null;
	k.raphael = a;

	function co() {
		return this.x + q + this.y
	}
	bO.resetScale = function() {
		if (this.removed) return this;
		this._.sx = 1;
		this._.sy = 1;
		this.attrs.scale = "1 1"
	};
	bO.scale = function(a, b, c, d) {
		if (this.removed) return this;
		if (a == null && b == null) return {
			x: this._.sx,
			y: this._.sy,
			toString: co
		};
		b = b || a;
		!(+b) && (b = a);
		var e, f, g, h, i = this.attrs;
		if (a != 0) {
			var j = this.getBBox(),
				k = j.x + j.width / 2,
				l = j.y + j.height / 2,
				m = B(a / this._.sx),
				o = B(b / this._.sy);
			c = +c || c == 0 ? c : k;
			d = +d || d == 0 ? d : l;
			var r = this._.sx > 0,
				s = this._.sy > 0,
				t = ~ (~ (a / B(a))),
				u = ~ (~ (b / B(b))),
				x = m * t,
				y = o * u,
				z = this.node.style,
				A = c + B(k - c) * x * (k > c == r ? 1 : -1),
				C = d + B(l - d) * y * (l > d == s ? 1 : -1),
				D = a * t > b * u ? o : m;
			switch (this.type) {
			case "rect":
			case "image":
				var E = i.width * m,
					F = i.height * o;
				this.attr({
					height: F,
					r: i.r * D,
					width: E,
					x: A - E / 2,
					y: C - F / 2
				});
				break;
			case "circle":
			case "ellipse":
				this.attr({
					rx: i.rx * m,
					ry: i.ry * o,
					r: i.r * D,
					cx: A,
					cy: C
				});
				break;
			case "text":
				this.attr({
					x: A,
					y: C
				});
				break;
			case "path":
				var G = bp(i.path),
					H = true,
					I = r ? x : m,
					J = s ? y : o;
				for (var K = 0, L = G[w]; K < L; K++) {
					var M = G[K],
						N = V.call(M[0]); {
						if (N == "M" && H) continue;
						H = false
					}
					if (N == "A") {
						M[G[K][w] - 2] *= I;
						M[G[K][w] - 1] *= J;
						M[1] *= m;
						M[2] *= o;
						M[5] = +(t + u ? !(!(+M[5])) : !(+M[5]))
					} else if (N == "H") for (var O = 1, P = M[w]; O < P; O++) M[O] *= I;
					else if (N == "V") for (O = 1, P = M[w]; O < P; O++) M[O] *= J;
					else for (O = 1, P = M[w]; O < P; O++) M[O] *= O % 2 ? I : J
				}
				var Q = bn(G);
				e = A - Q.x - Q.width / 2;
				f = C - Q.y - Q.height / 2;
				G[0][1] += e;
				G[0][2] += f;
				this.attr({
					path: G
				});
				break
			}
			if (this.type in {
				text: 1,
				image: 1
			} && (t != 1 || u != 1)) if (this.transformations) {
				this.transformations[2] = "scale(" [n](t, ",", u, ")");
				this.node[R]("transform", this.transformations[v](q));
				e = t == -1 ? -i.x - (E || 0) : i.x;
				f = u == -1 ? -i.y - (F || 0) : i.y;
				this.attr({
					x: e,
					y: f
				});
				i.fx = t - 1;
				i.fy = u - 1
			} else {
				this.node.filterMatrix = U + ".Matrix(M11=" [n](t, ", M12=0, M21=0, M22=", u, ", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");
				z.filter = (this.node.filterMatrix || p) + (this.node.filterOpacity || p)
			} else if (this.transformations) {
				this.transformations[2] = p;
				this.node[R]("transform", this.transformations[v](q));
				i.fx = 0;
				i.fy = 0
			} else {
				this.node.filterMatrix = p;
				z.filter = (this.node.filterMatrix || p) + (this.node.filterOpacity || p)
			}
			i.scale = [a, b, c, d][v](q);
			this._.sx = a;
			this._.sy = b
		}
		return this
	};
	bO.clone = function() {
		if (this.removed) return null;
		var a = this.attr();
		delete a.scale;
		delete a.translation;
		return this.paper[this.type]().attr(a)
	};
	var cp = {},
		cq = function(b, c, d, e, f, g, h, i, j) {
			var k = 0,
				l = 100,
				m = [b, c, d, e, f, g, h, i].join(),
				n = cp[m],
				o, p;
			!n && (cp[m] = n = {
				data: []
			});
			n.timer && clearTimeout(n.timer);
			n.timer = setTimeout(function() {
				delete cp[m]
			}, 2000);
			if (j != null) {
				var q = cq(b, c, d, e, f, g, h, i);
				l = ~ (~q) * 10
			}
			for (var r = 0; r < l + 1; r++) {
				if (n.data[j] > r) p = n.data[r * l];
				else {
					p = a.findDotsAtSegment(b, c, d, e, f, g, h, i, r / l);
					n.data[r] = p
				}
				r && (k += C(C(o.x - p.x, 2) + C(o.y - p.y, 2), 0.5));
				if (j != null && k >= j) return p;
				o = p
			}
			if (j == null) return k
		},
		cr = function(b, c) {
			return function(d, e, f) {
				d = bw(d);
				var g, h, i, j, k = "",
					l = {},
					m, n = 0;
				for (var o = 0, p = d.length; o < p; o++) {
					i = d[o];
					if (i[0] == "M") {
						g = +i[1];
						h = +i[2]
					} else {
						j = cq(g, h, i[1], i[2], i[3], i[4], i[5], i[6]);
						if (n + j > e) {
							if (c && !l.start) {
								m = cq(g, h, i[1], i[2], i[3], i[4], i[5], i[6], e - n);
								k += ["C", m.start.x, m.start.y, m.m.x, m.m.y, m.x, m.y];
								if (f) return k;
								l.start = k;
								k = ["M", m.x, m.y + "C", m.n.x, m.n.y, m.end.x, m.end.y, i[5], i[6]][v]();
								n += j;
								g = +i[5];
								h = +i[6];
								continue
							}
							if (!b && !c) {
								m = cq(g, h, i[1], i[2], i[3], i[4], i[5], i[6], e - n);
								return {
									x: m.x,
									y: m.y,
									alpha: m.alpha
								}
							}
						}
						n += j;
						g = +i[5];
						h = +i[6]
					}
					k += i
				}
				l.end = k;
				m = b ? n : c ? l : a.findDotsAtSegment(g, h, i[1], i[2], i[3], i[4], i[5], i[6], 1);
				m.alpha && (m = {
					x: m.x,
					y: m.y,
					alpha: m.alpha
				});
				return m
			}
		},
		cs = cr(1),
		ct = cr(),
		cu = cr(0, 1);
	bO.getTotalLength = function() {
		if (this.type != "path") return;
		if (this.node.getTotalLength) return this.node.getTotalLength();
		return cs(this.attrs.path)
	};
	bO.getPointAtLength = function(a) {
		if (this.type != "path") return;
		return ct(this.attrs.path, a)
	};
	bO.getSubpath = function(a, b) {
		if (this.type != "path") return;
		if (B(this.getTotalLength() - b) < "1e-6") return cu(this.attrs.path, a).end;
		var c = cu(this.attrs.path, b, 1);
		return a ? cu(c, a).end : c
	};
	a.easing_formulas = {
		linear: function(a) {
			return a
		},
		"<": function(a) {
			return C(a, 3)
		},
		">": function(a) {
			return C(a - 1, 3) + 1
		},
		"<>": function(a) {
			a = a * 2;
			if (a < 1) return C(a, 3) / 2;
			a -= 2;
			return (C(a, 3) + 2) / 2
		},
		backIn: function(a) {
			var b = 1.70158;
			return a * a * ((b + 1) * a - b)
		},
		backOut: function(a) {
			a = a - 1;
			var b = 1.70158;
			return a * a * ((b + 1) * a + b) + 1
		},
		elastic: function(a) {
			if (a == 0 || a == 1) return a;
			var b = 0.3,
				c = b / 4;
			return C(2, -10 * a) * y.sin((a - c) * (2 * D) / b) + 1
		},
		bounce: function(a) {
			var b = 7.5625,
				c = 2.75,
				d;
			if (a < 1 / c) d = b * a * a;
			else if (a < 2 / c) {
				a -= 1.5 / c;
				d = b * a * a + 0.75
			} else if (a < 2.5 / c) {
				a -= 2.25 / c;
				d = b * a * a + 0.9375
			} else {
				a -= 2.625 / c;
				d = b * a * a + 0.984375
			}
			return d
		}
	};
	var cv = [],
		cw = function() {
			var b = +(new Date);
			for (var c = 0; c < cv[w]; c++) {
				var d = cv[c];
				if (d.stop || d.el.removed) continue;
				var e = b - d.start,
					g = d.ms,
					h = d.easing,
					i = d.from,
					j = d.diff,
					k = d.to,
					l = d.t,
					m = d.el,
					n = {},
					o;
				if (e < g) {
					var r = h(e / g);
					for (var s in i) if (i[f](s)) {
						switch (X[s]) {
						case "along":
							o = r * g * j[s];
							k.back && (o = k.len - o);
							var t = ct(k[s], o);
							m.translate(j.sx - j.x || 0, j.sy - j.y || 0);
							j.x = t.x;
							j.y = t.y;
							m.translate(t.x - j.sx, t.y - j.sy);
							k.rot && m.rotate(j.r + t.alpha, t.x, t.y);
							break;
						case E:
							o = +i[s] + r * g * j[s];
							break;
						case "colour":
							o = "rgb(" + [cy(Q(i[s].r + r * g * j[s].r)), cy(Q(i[s].g + r * g * j[s].g)), cy(Q(i[s].b + r * g * j[s].b))][v](",") + ")";
							break;
						case "path":
							o = [];
							for (var u = 0, x = i[s][w]; u < x; u++) {
								o[u] = [i[s][u][0]];
								for (var y = 1, z = i[s][u][w]; y < z; y++) o[u][y] = +i[s][u][y] + r * g * j[s][u][y];
								o[u] = o[u][v](q)
							}
							o = o[v](q);
							break;
						case "csv":
							switch (s) {
							case "translation":
								var A = r * g * j[s][0] - l.x,
									B = r * g * j[s][1] - l.y;
								l.x += A;
								l.y += B;
								o = A + q + B;
								break;
							case "rotation":
								o = +i[s][0] + r * g * j[s][0];
								i[s][1] && (o += "," + i[s][1] + "," + i[s][2]);
								break;
							case "scale":
								o = [+i[s][0] + r * g * j[s][0], +i[s][1] + r * g * j[s][1], 2 in k[s] ? k[s][2] : p, 3 in k[s] ? k[s][3] : p][v](q);
								break;
							case "clip-rect":
								o = [];
								u = 4;
								while (u--) o[u] = +i[s][u] + r * g * j[s][u];
								break
							}
							break;
						default:
							var C = [].concat(i[s]);
							o = [];
							u = m.paper.customAttributes[s].length;
							while (u--) o[u] = +C[u] + r * g * j[s][u];
							break
						}
						n[s] = o
					}
					m.attr(n);
					m._run && m._run.call(m)
				} else {
					if (k.along) {
						t = ct(k.along, k.len * !k.back);
						m.translate(j.sx - (j.x || 0) + t.x - j.sx, j.sy - (j.y || 0) + t.y - j.sy);
						k.rot && m.rotate(j.r + t.alpha, t.x, t.y)
					}(l.x || l.y) && m.translate(-l.x, -l.y);
					k.scale && (k.scale += p);
					m.attr(k);
					cv.splice(c--, 1)
				}
			}
			a.svg && m && m.paper && m.paper.safari();
			cv[w] && setTimeout(cw)
		},
		cx = function(b, c, d, e, f) {
			var g = d - e;
			c.timeouts.push(setTimeout(function() {
				a.is(f, "function") && f.call(c);
				c.animate(b, g, b.easing)
			}, e))
		},
		cy = function(a) {
			return z(A(a, 255), 0)
		},
		cz = function(a, b) {
			if (a == null) return {
				x: this._.tx,
				y: this._.ty,
				toString: co
			};
			this._.tx += +a;
			this._.ty += +b;
			switch (this.type) {
			case "circle":
			case "ellipse":
				this.attr({
					cx: +a + this.attrs.cx,
					cy: +b + this.attrs.cy
				});
				break;
			case "rect":
			case "image":
			case "text":
				this.attr({
					x: +a + this.attrs.x,
					y: +b + this.attrs.y
				});
				break;
			case "path":
				var c = bp(this.attrs.path);
				c[0][1] += +a;
				c[0][2] += +b;
				this.attr({
					path: c
				});
				break
			}
			return this
		};
	bO.animateWith = function(a, b, c, d, e) {
		for (var f = 0, g = cv.length; f < g; f++) cv[f].el.id == a.id && (b.start = cv[f].start);
		return this.animate(b, c, d, e)
	};
	bO.animateAlong = cA();
	bO.animateAlongBack = cA(1);

	function cA(b) {
		return function(c, d, e, f) {
			var g = {
				back: b
			};
			a.is(e, "function") ? f = e : g.rot = e;
			c && c.constructor == bN && (c = c.attrs.path);
			c && (g.along = c);
			return this.animate(g, d, f)
		}
	}
	function cB(a, b, c, d, e, f) {
		var g = 3 * b,
			h = 3 * (d - b) - g,
			i = 1 - g - h,
			j = 3 * c,
			k = 3 * (e - c) - j,
			l = 1 - j - k;

		function m(a) {
			return ((i * a + h) * a + g) * a
		}
		function n(a, b) {
			var c = o(a, b);
			return ((l * c + k) * c + j) * c
		}
		function o(a, b) {
			var c, d, e, f, j, k;
			for (e = a, k = 0; k < 8; k++) {
				f = m(e) - a;
				if (B(f) < b) return e;
				j = (3 * i * e + 2 * h) * e + g;
				if (B(j) < 0.000001) break;
				e = e - f / j
			}
			c = 0;
			d = 1;
			e = a;
			if (e < c) return c;
			if (e > d) return d;
			while (c < d) {
				f = m(e);
				if (B(f - a) < b) return e;
				a > f ? c = e : d = e;
				e = (d - c) / 2 + c
			}
			return e
		}
		return n(a, 1 / (200 * f))
	}
	bO.onAnimation = function(a) {
		this._run = a || 0;
		return this
	};
	bO.animate = function(c, d, e, g) {
		var h = this;
		h.timeouts = h.timeouts || [];
		if (a.is(e, "function") || !e) g = e || null;
		if (h.removed) {
			g && g.call(h);
			return h
		}
		var i = {},
			j = {},
			k = false,
			l = {};
		for (var m in c) if (c[f](m)) {
			if (X[f](m) || h.paper.customAttributes[f](m)) {
				k = true;
				i[m] = h.attr(m);
				i[m] == null && (i[m] = W[m]);
				j[m] = c[m];
				switch (X[m]) {
				case "along":
					var n = cs(c[m]),
						o = ct(c[m], n * !(!c.back)),
						p = h.getBBox();
					l[m] = n / d;
					l.tx = p.x;
					l.ty = p.y;
					l.sx = o.x;
					l.sy = o.y;
					j.rot = c.rot;
					j.back = c.back;
					j.len = n;
					c.rot && (l.r = S(h.rotate()) || 0);
					break;
				case E:
					l[m] = (j[m] - i[m]) / d;
					break;
				case "colour":
					i[m] = a.getRGB(i[m]);
					var q = a.getRGB(j[m]);
					l[m] = {
						r: (q.r - i[m].r) / d,
						g: (q.g - i[m].g) / d,
						b: (q.b - i[m].b) / d
					};
					break;
				case "path":
					var t = bw(i[m], j[m]);
					i[m] = t[0];
					var u = t[1];
					l[m] = [];
					for (var v = 0, x = i[m][w]; v < x; v++) {
						l[m][v] = [0];
						for (var y = 1, z = i[m][v][w]; y < z; y++) l[m][v][y] = (u[v][y] - i[m][v][y]) / d
					}
					break;
				case "csv":
					var A = r(c[m])[s](b),
						B = r(i[m])[s](b);
					switch (m) {
					case "translation":
						i[m] = [0, 0];
						l[m] = [A[0] / d, A[1] / d];
						break;
					case "rotation":
						i[m] = B[1] == A[1] && B[2] == A[2] ? B : [0, A[1], A[2]];
						l[m] = [(A[0] - i[m][0]) / d, 0, 0];
						break;
					case "scale":
						c[m] = A;
						i[m] = r(i[m])[s](b);
						l[m] = [(A[0] - i[m][0]) / d, (A[1] - i[m][1]) / d, 0, 0];
						break;
					case "clip-rect":
						i[m] = r(i[m])[s](b);
						l[m] = [];
						v = 4;
						while (v--) l[m][v] = (A[v] - i[m][v]) / d;
						break
					}
					j[m] = A;
					break;
				default:
					A = [].concat(c[m]);
					B = [].concat(i[m]);
					l[m] = [];
					v = h.paper.customAttributes[m][w];
					while (v--) l[m][v] = ((A[v] || 0) - (B[v] || 0)) / d;
					break
				}
			}
		}
		if (k) {
			var G = a.easing_formulas[e];
			if (!G) {
				G = r(e).match(P);
				if (G && G[w] == 5) {
					var H = G;
					G = function(a) {
						return cB(a, +H[1], +H[2], +H[3], +H[4], d)
					}
				} else G = function(a) {
					return a
				}
			}
			cv.push({
				start: c.start || +(new Date),
				ms: d,
				easing: G,
				from: i,
				diff: l,
				to: j,
				el: h,
				t: {
					x: 0,
					y: 0
				}
			});
			a.is(g, "function") && (h._ac = setTimeout(function() {
				g.call(h)
			}, d));
			cv[w] == 1 && setTimeout(cw)
		} else {
			var C = [],
				D;
			for (var F in c) if (c[f](F) && Z.test(F)) {
				m = {
					value: c[F]
				};
				F == "from" && (F = 0);
				F == "to" && (F = 100);
				m.key = T(F, 10);
				C.push(m)
			}
			C.sort(be);
			C[0].key && C.unshift({
				key: 0,
				value: h.attrs
			});
			for (v = 0, x = C[w]; v < x; v++) cx(C[v].value, h, d / 100 * C[v].key, d / 100 * (C[v - 1] && C[v - 1].key || 0), C[v - 1] && C[v - 1].value.callback);
			D = C[C[w] - 1].value.callback;
			D && h.timeouts.push(setTimeout(function() {
				D.call(h)
			}, d))
		}
		return this
	};
	bO.stop = function() {
		for (var a = 0; a < cv.length; a++) cv[a].el.id == this.id && cv.splice(a--, 1);
		for (a = 0, ii = this.timeouts && this.timeouts.length; a < ii; a++) clearTimeout(this.timeouts[a]);
		this.timeouts = [];
		clearTimeout(this._ac);
		delete this._ac;
		return this
	};
	bO.translate = function(a, b) {
		return this.attr({
			translation: a + " " + b
		})
	};
	bO[H] = function() {
		return "Raphaël’s object"
	};
	a.ae = cv;
	var cC = function(a) {
			this.items = [];
			this[w] = 0;
			this.type = "set";
			if (a) for (var b = 0, c = a[w]; b < c; b++) {
				if (a[b] && (a[b].constructor == bN || a[b].constructor == cC)) {
					this[this.items[w]] = this.items[this.items[w]] = a[b];
					this[w]++
				}
			}
		};
	cC[e][L] = function() {
		var a, b;
		for (var c = 0, d = arguments[w]; c < d; c++) {
			a = arguments[c];
			if (a && (a.constructor == bN || a.constructor == cC)) {
				b = this.items[w];
				this[b] = this.items[b] = a;
				this[w]++
			}
		}
		return this
	};
	cC[e].pop = function() {
		delete this[this[w]--];
		return this.items.pop()
	};
	for (var cD in bO) bO[f](cD) && (cC[e][cD] = (function(a) {
		return function() {
			for (var b = 0, c = this.items[w]; b < c; b++) this.items[b][a][m](this.items[b], arguments);
			return this
		}
	})(cD));
	cC[e].attr = function(b, c) {
		if (b && a.is(b, G) && a.is(b[0], "object")) for (var d = 0, e = b[w]; d < e; d++) this.items[d].attr(b[d]);
		else for (var f = 0, g = this.items[w]; f < g; f++) this.items[f].attr(b, c);
		return this
	};
	cC[e].animate = function(b, c, d, e) {
		(a.is(d, "function") || !d) && (e = d || null);
		var f = this.items[w],
			g = f,
			h, i = this,
			j;
		e && (j = function() {
			!(--f) && e.call(i)
		});
		d = a.is(d, F) ? d : j;
		h = this.items[--g].animate(b, c, d, j);
		while (g--) this.items[g] && !this.items[g].removed && this.items[g].animateWith(h, b, c, d, j);
		return this
	};
	cC[e].insertAfter = function(a) {
		var b = this.items[w];
		while (b--) this.items[b].insertAfter(a);
		return this
	};
	cC[e].getBBox = function() {
		var a = [],
			b = [],
			c = [],
			d = [];
		for (var e = this.items[w]; e--;) {
			var f = this.items[e].getBBox();
			a[L](f.x);
			b[L](f.y);
			c[L](f.x + f.width);
			d[L](f.y + f.height)
		}
		a = A[m](0, a);
		b = A[m](0, b);
		return {
			x: a,
			y: b,
			width: z[m](0, c) - a,
			height: z[m](0, d) - b
		}
	};
	cC[e].clone = function(a) {
		a = new cC;
		for (var b = 0, c = this.items[w]; b < c; b++) a[L](this.items[b].clone());
		return a
	};
	a.registerFont = function(a) {
		if (!a.face) return a;
		this.fonts = this.fonts || {};
		var b = {
			w: a.w,
			face: {},
			glyphs: {}
		},
			c = a.face["font-family"];
		for (var d in a.face) a.face[f](d) && (b.face[d] = a.face[d]);
		this.fonts[c] ? this.fonts[c][L](b) : this.fonts[c] = [b];
		if (!a.svg) {
			b.face["units-per-em"] = T(a.face["units-per-em"], 10);
			for (var e in a.glyphs) if (a.glyphs[f](e)) {
				var g = a.glyphs[e];
				b.glyphs[e] = {
					w: g.w,
					k: {},
					d: g.d && "M" + g.d[Y](/[mlcxtrv]/g, function(a) {
						return ({
							l: "L",
							c: "C",
							x: "z",
							t: "m",
							r: "l",
							v: "c"
						})[a] || "M"
					}) + "z"
				};
				if (g.k) for (var h in g.k) g[f](h) && (b.glyphs[e].k[h] = g.k[h])
			}
		}
		return a
	};
	k.getFont = function(b, c, d, e) {
		e = e || "normal";
		d = d || "normal";
		c = +c || ({
			normal: 400,
			bold: 700,
			lighter: 300,
			bolder: 800
		})[c] || 400;
		if (!a.fonts) return;
		var g = a.fonts[b];
		if (!g) {
			var h = new RegExp("(^|\\s)" + b[Y](/[^\w\d\s+!~.:_-]/g, p) + "(\\s|$)", "i");
			for (var i in a.fonts) if (a.fonts[f](i)) {
				if (h.test(i)) {
					g = a.fonts[i];
					break
				}
			}
		}
		var j;
		if (g) for (var k = 0, l = g[w]; k < l; k++) {
			j = g[k];
			if (j.face["font-weight"] == c && (j.face["font-style"] == d || !j.face["font-style"]) && j.face["font-stretch"] == e) break
		}
		return j
	};
	k.print = function(c, d, e, f, g, h, i) {
		h = h || "middle";
		i = z(A(i || 0, 1), -1);
		var j = this.set(),
			k = r(e)[s](p),
			l = 0,
			m = p,
			n;
		a.is(f, e) && (f = this.getFont(f));
		if (f) {
			n = (g || 16) / f.face["units-per-em"];
			var o = f.face.bbox.split(b),
				q = +o[0],
				t = +o[1] + (h == "baseline" ? o[3] - o[1] + +f.face.descent : (o[3] - o[1]) / 2);
			for (var u = 0, v = k[w]; u < v; u++) {
				var x = u && f.glyphs[k[u - 1]] || {},
					y = f.glyphs[k[u]];
				l += u ? (x.w || f.w) + (x.k && x.k[k[u]] || 0) + f.w * i : 0;
				y && y.d && j[L](this.path(y.d).attr({
					fill: "#000",
					stroke: "none",
					translation: [l, 0]
				}))
			}
			j.scale(n, n, q, t).translate(c - q, d - t)
		}
		return j
	};
	a.format = function(b, c) {
		var e = a.is(c, G) ? [0][n](c) : arguments;
		b && a.is(b, F) && e[w] - 1 && (b = b[Y](d, function(a, b) {
			return e[++b] == null ? p : e[b]
		}));
		return b || p
	};
	a.ninja = function() {
		i.was ? h.Raphael = i.is : delete Raphael;
		return a
	};
	a.el = bO;
	a.st = cC[e];
	i.was ? h.Raphael = a : Raphael = a
})()